Error when trashing oldest files in a directory. (gio trash error when used with xargs)

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?

0
задан 9 May 2020 в 17:16

1 ответ

Экранирующий символ \ 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
3
ответ дан 19 June 2020 в 21:41

Другие вопросы по тегам:

Похожие вопросы: