Как я могу рандомизировать имена файлов в данном каталоге?

Я никогда не использовал комаров, таким образом, трудно сказать что точно edit-pr ожидание должно быть сделано. Но от того, что Вы дали нам, Вы могли попытаться заменить ENV РЕДАКТОРА к пользовательскому сценарию оболочки, или возможно даже сценарию Python или чему-то.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

Но как я сказал, я не знаю, какие редактирования это хочет, или что потребности быть сделанным в редакторе. Возможно, если бы Вы дали нам пример того, что Вы хотели бы автоматизировать?

1
27.01.2011, 23:16
3 ответа
find . -type f |
shuf |  # shuffle the input lines, i.e. apply a random permutation
nl -n rz |  # add line numbers 000001, …
while read -r number name; do
  ext=${name##*/}  # try to retain the file name extension
  case $ext in
    *.*) ext=.${ext##*.};;
    *) ext=;;
  esac
  mv "$name" "../randomized/${name%/*}/$number$ext"
done

Замена mv ln или ln -s и возможно другой целевой каталог, как Вы считаете целесообразным. Обратите внимание на это с тех пор find может все еще пересекать каталог к этому времени mv выполнения, Вы не должны переименовывать или связывать файл в том же каталоге.

shuf характерно для GNU coreutils, остальное - POSIX. Если Вы не находитесь на Linux или Cygwin, посмотрите альтернативы в awk или Perl.

5
27.01.2020, 23:14
  • 1
    Ничего себе, это работает отлично, Спасибо! (я забыл упоминать, что я был на Ubuntu) –  Josh 27.01.2011, 23:15
  • 2
    Поскольку это добавляет номера строки и затем просто использует числа для нового имени, нет никакой возможности права коллизий? (Или я понимаю код неправильно?) –  Josh 27.01.2011, 23:18
  • 3
    @Josh: Право, имена файлов будут использовать последовательные целые числа. Числа будут глобально уникальны, даже если будут подкаталоги. –  Gilles 'SO- stop being evil' 27.01.2011, 23:20

Нет ничего Unix, конкретного здесь...

import random, os

input_path = "/home/badp/Youtube/" #absolute path for simplicity
output_path = "./playlist"
files = os.listdir(input_path) #assume all files in the same folder for simplicity
random.shuffle(files)

os.mkdir(output_path)
os.chdir(output_path)
i = 0 
for filename in files:
  os.link( os.path.join(input_path, filename),
           str(i) + filename[filename.rfind(os.path.extsep):]
         )         #↑ there must be something cleaner than this :)
  i += 1

Это повредится, если будут папки в input_path (который Вы не можете hardlink), но можно легко переписать логику "поиска" файла к чему-то намного более устойчивому (рекурсивный поиск и т.д.) с помощью os.path и os.walk.

2
27.01.2020, 23:14
  • 1
    О, и это должно работать над Windows + NTFS также! –  badp 27.01.2011, 22:58
  • 2
    я попробую этот badp... Я соглашаюсь, что нет ничего определенного для Unix относительно Вашего сценария, так как это - просто Python. Я отправлял здесь, чтобы видеть, была ли некоторая последовательность команды Unix, которая могла бы сделать это, но в действительности Python работает также. Кроме карты FAT32 отформатирован, который будет поддерживать hardlinks? –  Josh 27.01.2011, 23:12
  • 3
    @Josh нет, затем можно просто скопировать :) –  badp 27.01.2011, 23:52

Я вижу принятый ответ и другой хороший ответ. Так или иначе вот сценарий, который я использовал. Это рандомизирует имена путем изменения их на последовательность хеша, вычисленную полным путем. Поскольку полный путь уникален для каждой системы, ожидается, что имена файлов не сталкиваются (это не является надежным и добавляет, что проверка была бы легка, но я не беспокоился). Этот сценарий переименовывает файлы рекурсивно, но неповрежденные имена каталогов отпуска. Используйте это путем передачи папки для применения рекурсивный переименовывает в качестве параметра.

#! /bin/bash                                                                                                                                             

do_rename() {
    (
    export prevdir="$(pwd)"
    cd "$1"
    for file in *
    do
        if [ -d "$file" ]
        then
            echo "$file is a directory, renaming recursively"
            do_rename "$file"
        elif [ -f "$file" ]
        then
            dirpath="$prevdir/$1"
            oldname="$dirpath/$file"
            name_hash=$(echo "$oldname" | md5sum)
            newname="$dirpath/${name_hash:0:32}.jpg"
            echo "mv $oldname $newname"
            mv $oldname $newname
        fi
    done
    cd "$prevdir"
    )
}

do_rename "$1"
0
27.01.2020, 23:14

Теги

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