Piping find -name для xargs приводит к именам файлов с пробелами, которые не передаются команде

22

Обычно для удаления файлов с пробелами в имени файла вам нужно запустить:

$ rm "file name"

, но если я хочу удалить несколько файлов, например:

$ find . -name "*.txt" | xargs rm

Это не будет удалять файлы с пробелами в них.

    
задан Ashley 26.08.2015 в 12:13
источник

3 ответа

40

Вы можете указать find и xargs для использования нулевых терминаторов

find . -name "*.txt" -print0 | xargs -0 rm

или (проще) использовать встроенное действие -delete find

find . -name "*.txt" -delete

или (thanks @kos)

find . -name "*.txt" -exec rm {} +

любой из них должен соблюдать ограничение ARG_MAX системы без необходимости в xargs .

    
ответ дан steeldriver 26.08.2015 в 12:19
источник
1

Кстати, если вы использовали что-то другое, кроме find, вы можете использовать tr для замены строк новой строки нулевыми байтами.

Eg. следующий один лайнер удаляет 10 последних измененных файлов в каталоге, даже если они имеют пробелы в своих именах.

ls -tp | grep -v / | head -n 10 | tr "\n" "%co_de%" | xargs -0 rm

    
ответ дан Ibrahim 03.05.2017 в 22:00
0

Команда xargs использует вкладки, пробелы и новые строки как разделители по умолчанию. Вы можете сказать, что использовать только символы новой строки ('\ n') с опцией -d:

find . -name "*.txt" | xargs -d '\n' rm

Ответ на источник SO .     

ответ дан joseph_morris 13.04.2018 в 20:48