for file in *[!0]; do mv "$file" "${file}0"; done
Для каждого имени, которое не заканчивается 0
, переименуйте его так, как надо. Обратите внимание, что в них обрабатываются имена с пробелами и т. Д.
Я хочу дать скрипт каталога, и он будет переименовать файлы в нем, которые не заканчиваются в 0. Как я могу использовать это таким образом, я могу сказать, сценарий, какой каталог для работы с?
Таким образом, сделать тривиальные необходимые изменения, работая с одной директорией (и не отвергая командную строку, если более чем один каталог задан, просто спокойно игнорируя массовку):
for file in "${1:?}"/*[!0]; do mv "$file" "${file}0"; done
"${1:?}"
нотация гарантирует, что $1
установлен и не пуст, генерируя сообщение об ошибке, если это не так. Вместо этого вы можете вместо этого записать "${1:-.}"
; который будет работать с текущим каталогом, а не с удаленным каталогом. Затем glob генерирует список имен файлов в этом каталоге, который не заканчивается 0
, и переименовывает их так, чтобы они выполнялись. Если у вас есть Bash, вы можете использовать shopt -s nullglob
, вы не столкнетесь с проблемами, если в каталоге нет файлов без суффикса 0
.
Вы можете обобщать обрабатывать любое количество аргументов (все должны быть каталоги, по умолчанию в текущем каталоге, если не указан каталог):
for dir in "${@:-.}"
do
for file in "$dir"/*[!0]; do mv "$file" "${file}0"; done
done
или (заставляющие каталоги):
for dir in "${@:-.}"
do
(cd "$dir" && for file in *[!0]; do mv "$file" "${file}0"; done)
done
Это имеет смысл сообщить, какие аргументы не являются каталогами или недоступными каталогами.
Есть бесконечные вариации такого рода, которые можно было бы сделать; некоторые из них могут даже оказаться полезными.
Теперь я хочу сделать то же самое, но вместо этого файла, заканчивающейся «0
», скрипт должен переименовать файлы, которые не заканчиваются «.0
» так, что они заканчиваются ".0
«?
Это немного сложнее из-за пересмотренного финала. Недостаточно просто использовать [!.][!0]
. Например, если список файлов включает 30
, x.0
, x0
, z.9
и z1
, то echo *[!.][!0]
только списки z1
(опуская 30
, x0
и z.9
, которые не заканчиваются с .0
).
я бы, вероятно, использовать что-то вроде этого, вместо:
for dir in "${@:-.}"
do
(
cd "$dir" &&
for file in *
do
case "$file" in
(*.0) : skip it;;
(*) mv "$file" "${file}0";;
esac
done
)
done
Другие альтернативные списки более GLOB моделей:
for dir in "${@:-.}"
do
(cd "$dir" && for file in *[!.][!0] *.[!0] *[!.]0; do mv "$file" "${file}0"; done)
done
Обратите внимание, что это быстро становится намного сложнее, если вы хотите, чтобы искать файлы не заканчиваются .00
- было бы 7 выражений глобуса (но вариант case
будет работать одинаково прямолинейно), а shopt -s nullglob
становится все более важным (или вам нужно [ -f "$file" ] && mv "$file" "${file}.0"
вместо o f более простая команда перемещения).
Как я могу использовать это так, чтобы я мог сказать скрипту, какой каталог работать? – hydrz
Он работает. Теперь я хочу сделать то же самое, но вместо «0» с «.0». Сценарий не распознает файл с именем 30. Я предполагаю, что это потому, что «.» работает как своего рода подстановочный знак, заменяя «3»? – hydrz
Итак, вы хотите переименовать файлы, которые не заканчиваются на '.0', чтобы они заканчивались' .0'? Это нерешительно, потому что шаблон распознавания является fiddlier. Пожалуйста, подтвердите, что я правильно интерпретировал ваше требование (комментарий ответа). –