for d in dir_*; do
printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
done
$d
заменяется на каждое имя каталога. ${d##*_}
заменяется на конечный номер в имени каталога, потому что он удаляет все до последнего подчеркивания из $d
. Дополнительные сведения см. в разделе «Расширение параметров» в руководстве BASH или спецификации POSIX . printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
записывает имя каталога в текстовый файл в этом каталоге. С одним -вкладышем:
for d in dir_*; do printf "%s\n" "$d" > "$d/file_${d##*_}.txt"; done
Я отдал предпочтение printf
вместо echo
, потому что есть особые случаи, которые правильно обрабатываются первыми, но не вторыми, хотя в представленном частном случае echo
не возникнет проблем. Подробнее см. Почему printf лучше, чем echo? .
Если вам нужно избегать каталогов, отличных от -, которые также начинаются с dir_
, вариант 1 — добавить тест [ -d "$d" ] &&
прямо перед оператором printf
в приведенном выше сценарии. Вариант 2 — использовать dir_*/
, чтобы сопоставлялись только каталоги:
for d in dir_*/; do
dirn=${d%%/}
printf "%s\n" "$dirn" > "${d}file_${dirn##*_}.txt"
done
find. -name 'dir_[0-9]*' -type d -execdir bash -c 'name=$0;printf "${name##*/}\n" > "$name/file_${name##*_}.txt"' '{}' \;
Выполнить несколько команд из результатов поиска, используя-execdir
name=$0;
=> сохранить каждое имя каталога в переменной $name и обработать его.