Как сделать что-то для каждого файла в каталоге, используя bash? - PullRequest
18 голосов
/ 21 августа 2009

Я начал с этого:

command *

Но это не работает, когда каталог пуст; * подстановочный знак становится буквальным символом "*". Поэтому я перешел к этому:

for i in *; do
   ...
done

, который работает, но опять же, если каталог пуст. Я использовал ls:

for i in `ls -A`

но, конечно, имена файлов с пробелами в них разделяются. Я попытался добавить ключ -Q:

for i in `ls -AQ`

, что приводит к разделению имен, только с кавычками в начале и конце имени. Я что-то упускаю здесь очевидное или это сложнее, чем должно быть?

Ответы [ 5 ]

39 голосов
/ 21 августа 2009

Если вы хотите что-то сделать только с файлами, простое решение - проверить, является ли $ i файлом:

for i in * 
do
    if test -f "$i" 
    then
       echo "Doing somthing to $i"
    fi
done

Вы действительно должны всегда делать такие тесты, потому что вы почти наверняка не хотите обрабатывать файлы и каталоги одинаково. Обратите внимание на кавычки вокруг «$ i», которые предотвращают проблемы с именами файлов, содержащими пробелы.

12 голосов
/ 21 августа 2009

find может быть тем, что вы хотите.

find . | while read file; do
    # do something with $file
done

Или, может быть, так:

find . -exec <command> {} \;

Если вы не хотите, чтобы поиск включал подкаталоги, вам может потребоваться добавить комбинацию -type f и -maxdepth 1 в команду поиска. Подробности см. На странице справки .

8 голосов
/ 21 августа 2009

Это зависит от того, собираетесь ли вы вводить это в командной строке и какую команду вы применяете к файлам.

Если он напечатан, вы можете выбрать второй вариант и заменить что-то безвредное для команды. Мне нравится использовать echo вместо mv или rm, например.

Поместите все в одну строку:

for i in * ; do command $i; done

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

5 голосов
/ 23 ноября 2011

Используйте shopt для предотвращения расширения до * .txt

shopt -s nullglob
for myfile in *.txt
do
    # your code here
    echo $myfile

done
2 голосов
/ 21 августа 2009

это должно сработать:

find -type d -print0 | xargs -n 1 -0 echo "your folder: {} !"
find -type f -print0 | xargs -n 1 -0 echo "your file: {} !"

print0 / 0 существуют, чтобы избежать проблем с пробелами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...