In 18.04 I was able to find and trash all but the newest n (e.g. 8) files in a directory with:
find . -maxdepth 1 -type f | sort -r | sed 1,8d | xargs -d \n gio trash
When I try this in a freshly installed 20.04 I get the error:
gio: file:///path/to/file.txt%0A: Error moving file /path/to/file.txt
to the Rubbish Bin: No such file or directory
I can manually trash the same file without error using:
gio trash file.txt
What am I missing after the upgrade?
Экранирующий символ \ n
интерпретируется bash перед xargs
работает, потому что вы его не цитировали. Таким образом, вы говорите xargs
вырезать элементы по n
, а не \ n
.
Вы хотите поместить его в одинарные кавычки: -d ' \ n '
.
Чтобы визуализировать проблему:
# cut by n where you want newline:
$ printf 'a\nb' | xargs -d \n -I{} echo -{}-
-a
b-
# quote \n and it works:
$ printf 'a\nb' | xargs -d '\n' -I{} echo -{}-
-a-
-b-
# cut by "n" if you had n in your filename:
$ printf 'anb' | xargs -d \n -I{} echo -{}-
-a-
-b-
(я использую -I {} echo - {} -
, чтобы показать отдельные элементы, чтобы показать, работает ли / как разделитель) )
Хотя это будет работать, я все же советую против этого
Вы никогда не должны использовать символ новой строки для разделения имен файлов, потому что новая строка является допустимым символом для него.
Лучше использовать:
find . -maxdepth 1 -type f -print0 | sort -rz | sed -z 1,8d | xargs -0 gio trash