IFS=',' read -a names <<< "${line}"
не удаляет "
со входа. В ваших именах файлов нет "
, поэтому вы также должны их удалить.
Backticks `не рекомендуется. Не используйте их. Вместо этого используйте $(....)
.
"для файла в` "так же плохо, как и for file in $(cat)
- это обычный bash антипаттерн. Не используйте его - у вас будут проблемы с элементами с пробелами или табуляцией. Используйте while IFS= read -r line
, чтобы прочитать что-то вроде строки.
Проблема с rename
, есть две распространенные версии rename
- GNU rename и perl переименовать . Похоже, ваш сценарий нацелен на версию perl - убедитесь, что она установлена.
Пусть rename
сделает переименование - здесь for file in find
не требуется.
Если Вы делаете while read line
, а затем IFS=, read <<<"$line"
дублирует работу, просто сделайте while IFS=, read -a names; do
с самого начала.
Так что вы можете сделать:
# split the input on ','
while IFS=',' read -r pre post; do
# remove quotes
pre=${pre//\"/}
post=${post//\"/}
# do the rename
rename "s/${pre}/${post}/" *
done < ${inputfile}
Я думаю, я бы сделал следующий скрипт, который использует sed
:
# find all files in a directory
find . -maxdepth 1 -type f |
# convert filenames into pairs (filename,new_filename) separated by newline
sed "
# hold the line in hold space
h
# replace the characters as in the other file
$(
# generate from "abc","def" -> s"abc"def"g
sed 's@"\([^"]*\)","\([^"]*\)"@s"\1"\2"g@' changenames.csv
)
# switch pattern and hold space
x
# append the line
G
# remove the line if substitute is the same
/^\(.*\)\n\1$/d
" |
# outputs two lines per each filename:
# one line with old filename and one line with new filename
# so just pass that to mv
xargs -l2 echo mv -v
и один вкладыш:
find . -maxdepth 1 -type f | sed "h;$(sed 's@"\([^"]*\)","\([^"]*\)"@s"\1"\2"g@' changenames.csv);x;G; /^\(.*\)\n\1$/d" | xargs -l2 echo mv -v
со следующей структурой воссоздания файлов:
touch abdogf.png abcatf.png abhorsef.png
cat <<EOF >changenames.csv
"dog","woof"
"cat","miaow"
"horse","neigh"
EOF
скрипт выходы на репле :
mv -v ./abdogf.png ./abwooff.png
mv -v ./abcatf.png ./abmiaowf.png
mv -v ./abhorsef.png ./abneighf.png