Как запустить цикл во всех каталогах внутри каталога

Я не думаю, что имена ваших папок будут проблемой. Но я бы предложил использовать подстановку оболочки вместо find, просто чтобы упростить синтаксис. Что-то вроде этого:

shopt -s globstar nullglob 
destination=/path/to/thumbnails
cd /path/to/originalphotos
for i in **/*{jpg,JPG}; do 
    dirName=${i%/*}
    file=$(basename "$i")
    fileName="${file%.*}"
    echo convert "$i" -auto-orient -resize 1920x1080\> \
        --write "$destination/${fileName}_thumb.JPG" 
done

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

for i in **/*{jpg,JPG}; do 
    dirName=${i%/*} 
    file=$(basename "$i")
    fileName="${file%.*}" 
    ext="${file##*.}" 
    echo convert "$i" -auto-orient -resize 1920x1080\> \
        --write "$destination/${fileName}_thumb.$ext"
done
-2
28.09.2020, 22:09
2 ответа

Вы можете использоватьfind:

find /tmp/main -type d -exec touch {}/test.txt \;

И если вы хотите исключить папку /tmp/mainиз результатов find, используйте:

find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;

или

find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;
2
18.03.2021, 23:02

Подойдет простой цикл:

for dir in /tmp/main/*/; do
    touch "$dir"/test.txt
done

/в конце шаблона /tmp/main/*/гарантирует, что если шаблон соответствует чему-либо, он будет соответствовать каталогу.

В bashвы можете установить параметр оболочки nullglobс помощью shopt -s nullglobперед циклом, чтобы убедиться, что цикл вообще не запускается, если шаблон ничему не соответствует. Без установки nullglobцикл все равно будет выполняться один раз с нерасширенным шаблоном в $dir. Еще один способ исправить это — убедиться, что $dirна самом деле является каталогом, прежде чем вызыватьtouch:

for dir in /tmp/main/*/; do
    if [ -d "$dir" ]; then
        touch "$dir"/test.txt
    fi
done

или, что то же самое,

for dir in /tmp/main/*/; do
    [ -d "$dir" ] && touch "$dir"/test.txt
done
5
18.03.2021, 23:02

Теги

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