Для каждой подпапки файлы вида по имени и переименовывают их к последовательным заполненным числам (независимо от расширения)

Наутилус сохраняет историю каталогов посещаемой, который доступен через, это - меню истории или панель.

Это, кажется, не сохраняет вид записей, которые Вы ищете. Если Вам нужен этот вид безопасности, контролирующей Вас, должен рассмотреть установку файловой системы, которая регистрирует подобные изменения или позволяет создавать снимки так, можно сделать собственные сравнения.

5
23.07.2015, 18:21
4 ответа
for dir in */*; do           # loop over the directories
    (                        # run in a subshell ...
        cd "$dir"            # ... so we don't have to cd back
        files=(*)            # store the filenames in a zero-indexed array

        for index in "${!files[@]}"; do
            file=${files[$index]}
            ext=${file##*.}
            newname=$(printf "%02d.%s" $((index+1)) "$ext")
            mv "$file" "$newname"
        done
    )
done

Предположим, что у Вас есть файл без расширения. В этом случае это будет иметь то же имя кроме с ведущими числами (например. my_file => 05.my_file)

Все нескрытые записи каталога будут переименованы, включая каталоги.

7
27.01.2020, 20:36
  • 1
    Спасибо! FTR, мой друг записал следующий отрывок, который очень похож на Ваш ответ: gist.github.com/2471545 –  Mathias Bynens 23.04.2012, 23:01
  • 2
    там является открытой кавычкой в ext=... –  thumbmunkeys 26.08.2014, 23:25

У Вас есть два набора проблем здесь:

  1. Рекурсивный вызов в каталоги.
  2. Перезапуск системы нумерации в рамках каждого отдельного каталога.

Это обработает оба условия гладко, хотя Вы захотите изменить переменную IMAGE_TYPES, если Вы решите включать другие расширения также.

#!/bin/bash

shopt -s extglob
shopt -s nocaseglob

IMAGE_TYPES='jpg|png|gif'
IFS=$'\n' dirlist=(`find "$PWD" -type d`)

for dir in "${dirlist[@]}"; do
    cd "$dir"
    ls *.+($IMAGE_TYPES) > /dev/null 2>&1 || continue

    counter=0
    for file in *.+($IMAGE_TYPES); do
        printf -v newname "%.3d.%s" $((counter += 1)) "${file##*.}"
        mv --verbose "$file" "$newname"
    done
done
3
27.01.2020, 20:36

Если у Вас есть название файла, можно добраться, это - число путем выполнения:

ls -1 <your_dir> | grep <file_name> -B 1000 | wc -l
-1
27.01.2020, 20:36
  • 1
    Парсинг вывода ls не хорошая идея. Это будет главным образом работать здесь, но основанное на подстановочном знаке решение будет полностью работать, итак, почему довольствуются вторым местом? –  Gilles 'SO- stop being evil' 24.04.2012, 02:16
  • 2
    "ls-1" дает Вам только имена файлов, если это - то, что Вы имеете в виду. –  alexarsh 24.04.2012, 19:46
  • 3
    В большинстве случаев, да. В целом, нет. Попробуйте (в bash/ksh/zsh) touch junk precious $'junk\nprecious'; ls -1 | grep junk | xargs -l rm. Вы действительно не заботились об этом precious файл, не так ли? Не говоря уже о том, что ограничение на самое большее 1 000 файлов или то, что Вы находите 03.jpg когда Вы ищете 3.jpg. Я отрекаюсь от своего комментария для второсортного, это действительно повреждается, и это неполно для начальной загрузки. –  Gilles 'SO- stop being evil' 24.04.2012, 20:26

Я создал то же дерево и построил ваше движение. Вот что я придумал:

n=0 IFS=.; set -f ./[e]vent*/*/*
for f do [ -n "${f##./\[*}" ] || break
    [ "$d" = "${f%/*}" ] || i=0 d=${f%/*}
    mv=': mv "${'$((n=$n+1))'}" "${'$n'%%/*}/'
    printf "$mv%.2d%.0s.%s\"\n" $((i=$i+1)) ${f##*/}
done | sh -sx -- "$@"

Без этой последней | трубы на конце вот что он печатает:

mv "${1}" "${1%/*}/01.jpg"
mv "${2}" "${2%/*}/02.png"
mv "${3}" "${3%/*}/01.jpg"
mv "${4}" "${4%/*}/02.png"
mv "${5}" "${5%/*}/03.gif"
mv "${6}" "${6%/*}/01.jpg"
mv "${7}" "${7%/*}/02.png"
mv "${8}" "${8%/*}/01.jpg"
mv "${9}" "${9%/*}/02.png"
mv "${10}" "${10%/*}/03.gif"

Это не похоже на много, я знаю, но здесь важно то, что что вам не нужно беспокоиться о каких-либо странных именах файлов или о чем-либо из этого - предполагаемое место назначения для этого вывода - оболочка, которая разделяет позиционный массив с циклом for , который его сгенерировал. У меня есть один такой в ​​команде - и он настроен для предоставления отладочного вывода, который выглядит следующим образом:

+ : mv ./event-a/album-a/a.jpg ./event-a/album-a/01.jpg
+ : mv ./event-a/album-a/x.png ./event-a/album-a/02.png
+ : mv ./event-a/album-b/a.jpg ./event-a/album-b/01.jpg
+ : mv ./event-a/album-b/x.png ./event-a/album-b/02.png
+ : mv ./event-a/album-b/y.gif ./event-a/album-b/03.gif
+ : mv ./event-b/album-x/a.jpg ./event-b/album-x/01.jpg
+ : mv ./event-b/album-x/x.png ./event-b/album-x/02.png
+ : mv ./event-b/album-y/a.jpg ./event-b/album-y/01.jpg
+ : mv ./event-b/album-y/x.png ./event-b/album-y/02.png
+ : mv ./event-b/album-y/y.gif ./event-b/album-y/03.gif

Вот как это выглядит, когда : является первым символом в Строка формата printf . Когда я удаляю его и выполняю команду:

ls ./event*/*/

./event-a/album-a/:
01.jpg  02.png

./event-a/album-b/:
01.jpg  02.png  03.gif

./event-b/album-x/:
01.jpg  02.png

./event-b/album-y/:
01.jpg  02.png  03.gif

Это похоже на ваш запрос. Думаю, вы не сможете превзойти результаты.

0
27.01.2020, 20:36

Теги

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