3

Я хочу сделать некоторые задачи в каждом каталоге в текущем пути, поэтому я попытался

for DIRECTORY in `find . -type d -maxdepth 1`
do
    cd $DIRECTORY

    #DO STUFF

    cd ..
done

но я получил длинную ошибку нет такого файла.

updateall.sh: line 5: cd: ./abc No such file or directory

Зачем ? Я попробовал cd ./abc, и это было нормально.

Спасибо

2 ответа2

4

Вам нужно добавить -mindepth 1 . В противном случае вы cd .. из исходной базовой директории в первом повторении цикла и в конечном итоге в его родительском каталоге.

Легко заметить, когда вы запускаете выражение find :

$ find . -type d -maxdepth 1
.
./abc

В первом цикле вы cd . , который ничего не делает, а затем cd .. , из которого вы не можете ввести все другие каталоги, которые вы нашли.


Если нет проблем с пробелами в именах каталогов, вы всегда можете find $PWD вместо find . использовать абсолютные пути или сохранить исходный $PWD в переменной, к которой вы можете перейти cd ($OLDPWD и cd - скорее всего, работать не будет) вместо cd ..

1

Вы можете рассмотреть возможность использования -execdir, если вы используете gnu-find. Это похоже на -exec, но выполнит команду из каталога. (Это может быть специальный скрипт, если он будет заполнять несколько строк, например.)

find . -type d -maxdepth 1 -mindepth 1 -execdir dostuff ";" 

С помощью

for DIRECTORY in `find ...`

уязвим для пробелов и подобных вещей в именах каталогов.

Пример:

mkdir "a a"
echo "123" > a 

for f in $(find . -mindepth 1 -type d); do echo "using $f"; ls -l $f ; done 
using ./a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 ./a
using a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 a

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .