Я написал код, чтобы изменить имя массива файла, он должен заменить пробелы подчеркиванием и подчеркивать все имена файлов.
это код
for file in *;
do mv "$file" `echo $file | sed -e 's/ */_/g' -e 's/_-_/-/g'`;
do mv -f "$file" `echo "$file" | tr A-Z a-z`;
done;
Я знаю переменная $file
изменится после 2-й строки, поэтому она будет давать ошибку в 3-й строке
Я могу разделить ее на 2 цикла, и тогда она будет работать, но мне нужно посоветовать, как преодолеть это в одной for
только петля
Для переименования файлов, вероятно, более просто использовать perl's rename
утилита (иногда называемый prename
). Я предположу, тем не менее, что Вы делаете это как упражнение в изучении сценариев оболочки.
Для решения непосредственной проблемы все, в чем Вы нуждаетесь, является второй переменной оболочки, здесь названной new
:
for file in *
do
new=$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g')
mv -f "$file" "$(echo "$new" | tr A-Z a-z)"
done
Другой подход должен расширить конвейер:
for file in *
do
mv -f "$file" "$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g' | tr A-Z a-z)"
done
, Если у Вас есть GNU sed, затем конвейер может быть упрощен далее:
for file in *
do
mv -f "$file" "$(echo "$file" | sed -e 's/ */_/g' -e 's/_-_/-/g' -e 's/.*/\L&/')"
done
, Так как Вы использовали -f
опция к mv
, возможно, что этот сценарий заставит файлы в Вашем каталоге быть перезаписанными и их потерянное содержание.
Рассматривают использование $(...)
вместо одинарных левых кавычек для замены команды. Долларовые-parens вложенные множества формы хорошо, это визуально ясно, и это избегает, что беспорядок, который происходит, потому что много шрифтов не показывают четкое различие между задними галочками и регулярными галочками.
Много языков требуют точки с запятой в конце каждой команды. оболочка не является одним из тех языков: символ новой строки заканчивает команду просто способ, которым делает точка с запятой.
sudo -i gedit /etc/fstab
. – heynnema 15 November 2016 в 17:07