Я пытаюсь удалить все файлы с пробелами в их именах. Я использую следующую команду. Но это дает мне ошибку
Команда: ls | egrep '. ' | xargs rm
Здесь, если я использую только ls | egrep '. '
команду, она дает мне все имя файла с пробелами в именах файлов. Но когда я пытаюсь передать вывод в rm, все пробелы (ведущие или конечные) удаляются. Так что моя команда не выполняется должным образом.
Любые указатели о том, как удалить файл, по крайней мере один пробел в их имени?
echo
сначала, чтобы избежать опечаток. Добавьтеecho
спереди, и он распечатает все файлы, которые собирается удалить.find
это мощно, иногда вам не нужно убивать курицу из пулемета. Администраторы UNIX, как правило, не прибегаютfind
(например) к «удалению всех файлов, начинающихся с буквы A» ... просто такrm A*
. Аналогично, чтобы удалить файлы, содержащие пробелы, rm может сделать эту работу. Другими словами, не обманывайте себя, потому что пространство невидимо и обрабатывается специально оболочкой. Просто избежите этого, как сделал Стивен Китт, и вы можете думать об этом как о любом другом персонаже.Я бы не стал разбирать
ls
выводПочему бы и нет :
Нет проблем с
rm
:-).Хотя это рекурсивно и удалит все файлы с пробелами в текущем каталоге и вложенных каталогах, как упомянуто в комментариях.
источник
-name '* *'
вместо регулярного выражения; и (2) вы можете использовать-print0 | xargs -0 rm -i
для решения проблемы @ StephenKitt.xargs
. Просто используйте-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Посмотрите на это Предположим, имя "странный файл"
Решение первое
Решение второе
Решение третье
тогда вы видите инод
В случае очень странных имен файлов, таких как
использование
источник
От
man xargs
Мы можем (в основном) исправить вашу начальную команду, изменив разделитель xargs на новую строку:
ls | egrep '. ' | xargs -d '\n' rm
(не делай этого ... читай дальше)Но что, если имя файла содержит новую строку?
touch "filename with blanks and newline"
ls
это действительно инструмент для непосредственного потребления человеком , вместо этого нам нужно использоватьfind
команду, которая может разделять имена файлов нулевым символом (-print0
). Мы также должны указать grep использовать нулевые символы для разделения input (-z
) и output (-Z
). Наконец, мы говорим Xargs также использовать нулевые символы (-0
)find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
источник
Вы можете использовать:
источник
Для этого вам понадобится
-Z
опция grep и-0
опция xargs. Но я бы так не поступил (ls
это не самый подходящий инструмент для работы, есть много проблем с тем, чтобы заставить компьютер читать результаты).Смотрите другие ответы для лучшего пути.
Также
ls | …
эквивалентноls -d *
иecho * | …
Все из которых имеют проблемы. Поэтому не используйте
ls
так, используйте решение из другого ответа.источник
ls *
когда каналы выводят имена файлов с разделителями.echo
(по крайней мере, некоторыеecho
реализации) расширяет последовательности с обратной косой чертой.grep -Z
предназначен для записи имен файлов с разделением NUL при использовании-l
, здесь это не поможет. Если вы имели в виду-z
, это тоже не поможет, так как в большинствеls
реализаций отсутствует опция для вывода имен файлов с разделителями NUL. Можно сделать что-то вроде,printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
хотя.