Сценарий Bash для переименования файлов в зависимости от размера

Бахрат с этого форума опубликовал ответ, который был очень близок к решению проблемы, каким-то образом он был удален из этого поста (код ниже ). Единственная проблема в том, что он не может обрабатывать канал | в строке (т.е. "25"|"для объединения данных | должен использоваться"|"дополнение 1"|20|"последняя запись" )Он должен был опубликовать сегодня, но ветка была удалена ??

awk -v FS='|' -v OFS='|' '{for(i=1;i<=NF;i++){gsub(/"/,"\"\"",$i);sub(/"/,"",$i);sub(/"[^"]*$/,"",$i)}print}' myfile > myfile3
5
10.04.2020, 02:46
3 ответа

Основная хитрость заключается в замене

    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предотвращает перезапись файлов назначения в случае двойного запуска сценария

П.С. Ответ Оле Танге - очень хороший и эффективный способ сделать то же самое, но вы, вероятно, не увидите разницы, если не будете регулярно переименовывать тысячи файлов.

4
28.04.2021, 23:18

Примерно так:

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}
5
28.04.2021, 23:18

В оболочке 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.

2
28.04.2021, 23:18

Теги

Похожие вопросы