$ 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
$
Попробуйте вместо этого использовать find
. Если вы не хотите, чтобы find
было рекурсивным,вы можете использовать параметры глубины:
find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete
Анализ вывода ls
не рекомендуется, поскольку ls
не всегда точен, поскольку ls
печатает удобочитаемую -версию имени файла, которая может не совпадать с фактическим именем файла. Для получения дополнительной информации см. вики-статью parsing ls .
Я согласен с использование 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/{}"
Если у вас есть простой шаблон подстановки имен файлов оболочки, просто используйте его.
. (*
можно заменить более точным шаблоном ),
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
.