Бахрат с этого форума опубликовал ответ, который был очень близок к решению проблемы, каким-то образом он был удален из этого поста (код ниже ). Единственная проблема в том, что он не может обрабатывать канал | в строке (т.е. "25"|"для объединения данных | должен использоваться"|"дополнение 1"|20|"последняя запись" )Он должен был опубликовать сегодня, но ветка была удалена ??
awk -v FS='|' -v OFS='|' '{for(i=1;i<=NF;i++){gsub(/"/,"\"\"",$i);sub(/"/,"",$i);sub(/"[^"]*$/,"",$i)}print}' myfile > myfile3
Основная хитрость заключается в замене
for i in *.jpg
с
for i in $(ls -S *.jpg)
однако, как указал Кусалананда, это предполагает «образованные» имена файлов (без пробелов, без управляющих символов ), так что здесь другой подход:
count=1
ls -S --escape *.jpg | while read f; do
n=$(printf "%04d" $count)
((count++))
mv --no-clobber "$f" "$rename$n.jpg"
done
-S
сортирует по уменьшению размера файла --escape
предотвращает повреждение имен со встроенными символами новой строки --no-clobber
предотвращает перезапись файлов назначения в случае двойного запуска сценария
П.С. Ответ Оле Танге - очень хороший и эффективный способ сделать то же самое, но вы, вероятно, не увидите разницы, если не будете регулярно переименовывать тысячи файлов.
Примерно так:
echo "Please rename and press enter"
read rename
ls |
# prepend filename with file size in bytes
parallel stat -c %s,,sep,,%n -- |
# sort by number
sort -n |
# rename to sequencenumber followed by size in bytes
parallel -q --colsep,,sep,, mv {2} "$rename"{#}_{1}
В оболочке zsh
:
typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done
При этом будут перебираться все обычные файлы с суффиксом имени файла .jpg
в текущем каталоге в порядке от наибольшего к наименьшему. Для каждого файла он будет переименовывать его в aNNN.jpg
, где NNN
— нулевое -заполненное целочисленное количество файлов, обработанных до сих пор.
Квалификатор (.DNOL)
glob упорядочивает совпадающие имена файлов в правильном порядке, используяOL
("обратный порядок по длине" ), и выбирает только обычные файлы (, включая скрытые имена ), используя.D
(" обычные файлы и точечные -файлы" ). N
заставляет шаблон расширяться до нуля, если нет подходящего имени ("null glob" ).
Это будет работать со всеми допустимыми именами файлов в любой системе Unix с установленным zsh
.
Чтобы использовать это изbash
:
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done'
Если у вас есть переменная $rename
, которую вы хотите передать в качестве префикса имени файла вместо использованияa
:
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "$1$count.jpg"
done' zsh "$rename"
Обратите внимание, что zsh
в последней строке не является опечаткой и что значение $rename
используется как $1
внутри скрипта zsh -c
.