Удалить все файлы, содержащие указанную c строку - Bash - PullRequest
1 голос
/ 14 апреля 2020

У меня есть эти плохие данные

AWS-Console.pngcrop-AWS-Console.png                                                                                    
Alimofire.pngcrop-Alimofire.png                                                                                        
Amazon-ECR-.pngcrop-Amazon-ECR-.png                                                                                    
Amazon-ECS.pngcrop-Amazon-ECS.png                                                                                      
Amazon-RDS.pngcrop-Amazon-RDS.png                                                                                      
Angular.pngcrop-Angular.png                                                                                            
AngularJS.pngcrop-AngularJS.png 
.... 1000 more

Я пытаюсь их удалить

Я пытался

ls public/assets/fe/img/skill/ | grep crop | rm -rf *crop*
ls public/assets/fe/img/skill/ | grep crop | rm -rf
rm -rf $(ls public/assets/fe/img/skill/ | grep crop)

Ни одна из них не работает ...

Ответы [ 4 ]

4 голосов
/ 14 апреля 2020

rm может обрабатывать глобальные выражения, которые ls обрабатывает:

rm public/assets/fe/img/skill/*crop*
1 голос
/ 14 апреля 2020

Основной проблемой в ваших командах является отсутствие пути в выходных данных команды ls.

ls public/assets/fe/img/skill/ | grep crop вернется, например, AWS-Console.pngcrop-AWS-Console.png, который передается в rm. Но rm AWS-Console.pngcrop-AWS-Console.png терпит неудачу, потому что в текущем каталоге такого файла нет. Вместо этого должно быть rm public/assets/fe/img/skill/AWS-Console.pngcrop-AWS-Console.png.

Добавление -d к команде ls должно помочь:

ls -d public/assets/fe/img/skill/ | grep crop | rm -rf
rm -rf $(ls -d public/assets/fe/img/skill/ | grep crop)

Как указано в других ответах, существуют другие решения, в том числе :

rm public/assets/fe/img/skill/*crop*
find public/assets/fe/img/skill/ -name "*crop*" -type f -exec rm -i {} \;
1 голос
/ 14 апреля 2020

Вместо этого используйте команду find

find . -name "*crop*" -type f -exec rm -i {} \;
  • -type f будет указывать только на поиск файла и избегать каталогов
  • -exec требует, чтобы ввод команды заканчивался на \;, {} заменяется результатом команды
  • , -i попросит вас подтвердить; удалите его, как только убедитесь, что вы делаете.
  • совет отобразите результат заранее, указав -print вместо -exec ...

      find . -name "*crop*" -type f -print
    

Подробнее здесь где ваш вопрос найдет более точные ответы

0 голосов
/ 14 апреля 2020

Если это действительно большое количество файлов (очевидно, не в вашем случае), xargs может ускорить процесс . Это относится ко многим вещам, которые вы, возможно, захотите прочитать из канала.

 find . -name "*crop*" -type f | xargs rm

Основное преимущество использования find в том, что это простой способ игнорировать каталоги. Если это не проблема, позвольте ОС обработать все это.

printf "%s\n" public/assets/fe/img/skill/*crop* | xargs rm

Если вам нужно иметь возможность подбирать файлы в подкаталогах -

shopt -s globstar # double asterisks not include arbitrary preceding paths
printf "%s\n" public/assets/fe/img/skill/**crop* | xargs rm

Возможно, вы сначала захотите просмотреть список.

printf "%s\n" public/assets/fe/img/skill/*crop* >crop.lst 
# check the list - vi, grep, whatever satisfies you.
xargs rm < crop.lst  # fast-delete them in bulk 
...