Удалите файлы в каталоге с помощью ls grep и rm

$ ls
1.txt  3.txt
$ seq 1 10 | xargs -I {} ls {}.txt >/dev/null
ls: cannot access 2.txt: No such file or directory
ls: cannot access 4.txt: No such file or directory
ls: cannot access 5.txt: No such file or directory
ls: cannot access 6.txt: No such file or directory
ls: cannot access 7.txt: No such file or directory
ls: cannot access 8.txt: No such file or directory
ls: cannot access 9.txt: No such file or directory
ls: cannot access 10.txt: No such file or directory
$
1
28.04.2018, 08:36
3 ответа

Попробуйте вместо этого использовать find. Если вы не хотите, чтобы findбыло рекурсивным,вы можете использовать параметры глубины:

find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete

Анализ вывода lsне рекомендуется, поскольку lsне всегда точен, поскольку lsпечатает удобочитаемую -версию имени файла, которая может не совпадать с фактическим именем файла. Для получения дополнительной информации см. вики-статью parsing ls .

4
27.01.2020, 23:18

Я согласен с использование find является лучшим вариантом . Но я хочу добавить, почему ваша команда не работает.

Ваша команда:

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

lsвыводит имена файлов без пути . Но вы не добавляете путь к rm. Таким образом, он попытается удалить имена файлов из вашего подкаталога в вашем текущем/корневом каталоге.

Попробуйте

$ cd process_logs/; ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

Или

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs -i rm -f "process_logs/{}"
2
27.01.2020, 23:18

Если у вас есть простой шаблон подстановки имен файлов оболочки, просто используйте его.

. (*можно заменить более точным шаблоном ),

rm -f process_logs/*.txt

или, если файлов сотни тысяч, используйтеxargs:

printf '%s\0' process_logs/*.txt | xargs -0 rm -f

Если вам абсолютно необходимо использовать регулярное выражение, GNU findможет сделать это с помощью

find process_logs -maxdepth 1 -type f -regex '\.txt$' -delete

Обратите внимание, что предикат -regexсоответствует полному пути, а не только части имени файла в конце (, поэтому я привязал выражение к концу пути с помощью$). См. также параметр -regextypeв руководстве GNU find.

1
27.01.2020, 23:18

Теги

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