Как переименовать файлы внутри папки в соответствующий md5sum?

У меня есть большие образцы в папке с plain names and file names with spaces also, и я хочу переименовать все файлы в соответствующие md5sum.

Я попробовал эту логику for f in $(find /home/SomeFolder/ -type f) ;do mv "$f" "$(md5sum $f)";done

Но это не работает должным образом с некоторой ошибкой, такой как mv: cannot move to, указывающей на отсутствие такого каталога.

Также я попробовал эту логику переименовать файлы в md5 sum + extension (BASH) и попробовал это for f in $(find /home/Testing/ -type f) ;do echomd5sum $f;mv $f /home/Testing/"echomd5sum $f``"; done; ` Но это не работает.

Любые предложения, чтобы решить эту проблему.

Я хочу заменить файл на его имя md5sum без расширения

sample.zip --> c75b5e2ca63adb462f4bb941e0c9f509

c75b5e2ca63adb462f4bb941e0c9f509c75b5e2ca63adb462f --> c75b5e2ca63adb462f4bb941e0c9f509

file name with spaces.php --> a75b5e2ca63adb462f4bb941e0c9f509


person SaiKiran    schedule 23.02.2017    source источник
comment
Вы достигли этого с помощью скрипта bash? почему вы не выполняете этот скрипт из php с папкой в ​​качестве параметра?   -  person AFR    schedule 23.02.2017


Ответы (2)


См. раздел Почему вам не следует анализировать вывод ls или find в цикле for, ParsingLs,

Если у вас есть file names with spaces also, рекомендуем использовать параметр -print0 для GNU findutils для задания, которое включает символ \0 после имени файла с read с нулевым разделителем, как показано ниже.

Запустите приведенный ниже скрипт внутри /home/SomeFolder и используйте поиск из текущего каталога как

#!/bin/bash

while IFS= read -r -d '' file
do
    mv -v "$file" "$(md5sum $file | cut -d ' ' -f 1)"
done< <(find . -mindepth 1 -maxdepth 1 -type f -print0)

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

Флаг -v в mv предназначен для подробного вывода (который вы можете удалить), чтобы увидеть, как файлы должны быть переименованы.

person Inian    schedule 23.02.2017
comment
Журнал ошибок mv: cannot move '/home/Testing/results.json' to '7d3a4c935678a2233222b370655a6c11 /home/Testing/results.json': No such file or directory - person SaiKiran; 23.02.2017
comment
@BackdoorCipher: Вы можете запустить его внутри /home/folder - person Inian; 23.02.2017
comment
См. md5sum дает md5sum вместе с именем. Я думаю, что здесь есть проблема. - person SaiKiran; 23.02.2017
comment
@BackdoorCipher: должно работать! Не могли бы вы еще раз подтвердить? - person Inian; 23.02.2017
comment
@BackdoorCipher: невозможно понять код в комментариях, обновите его как часть вопроса. - person Inian; 23.02.2017
comment
@BackdoorCipher: с флагом -v во флаге mv вы должны были видеть, какой файл во что переименован, вы видели файл pdf, который вы упомянули, когда запускали скрипт? - person Inian; 23.02.2017
comment
Наконец: нашел свою ошибку, есть один файл с именем файла около 100 пробелов, затем _564.doc. Я вручную удалил это - person SaiKiran; 23.02.2017
comment
@BackdoorCipher: Рад, что вы нашли это и исправили, обновление, о котором идет речь, та часть, которая, как вы утверждали, не работает. - person Inian; 23.02.2017

Почему бы не использовать php-скрипт, что-то вроде ниже будет работать. Это позволит просмотреть все файлы, переименовать их, а затем, в случае успеха, удалить старый файл.

$path = '';
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) { 
        if (substr($file, 0, 1) == '.') {
            continue;
        }

            if (rename($path . $file, $path . md5($file)))
            {
                unlink($path . $file);
            }

    }
    closedir($handle); 
}
person Sphinx    schedule 23.02.2017