Вот мое решение, которое переименовывает файлы в dir1 в зависимости от размера файла.
Содержимое dir1:
-rw-r--r-- 1 haiv staff 10 Aug 16 13:18 file1.txt
-rw-r--r-- 1 haiv staff 20 Aug 16 13:18 file2.txt
-rw-r--r-- 1 haiv staff 30 Aug 16 13:18 file3.txt
-rw-r--r-- 1 haiv staff 205 Aug 16 13:18 file4.txt
(обратите внимание, что в пятом столбце хранятся размеры файлов.) Исодержимое dir2:
-rw-r--r-- 1 haiv staff 30 Aug 16 13:18 doc.txt
-rw-r--r-- 1 haiv staff 205 Aug 16 13:18 dopey.txt
-rw-r--r-- 1 haiv staff 20 Aug 16 13:18 grumpy.txt
-rw-r--r-- 1 haiv staff 10 Aug 16 13:18 happy.txt
Создайте файл с именем ~ / rename.awk (да, из домашнего каталога, чтобы не загрязнять ни dir1, ни dir2):
/^total/ {next} # Skip the first line (which contains the total, of ls -l)
{
if (name[$5] == "") {
name[$5] = $NF
print "# File of size", $5, "should be named", $NF
} else {
printf "mv '%s' '%s'\n", $NF, name[$5]
}
}
Сейчас,перейдите в dir1 (если вы хотите переименовать файлы в dir1) и выполните следующую команду:
$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l)
Вывод:
# File of size 30 should be named doc.txt
# File of size 205 should be named dopey.txt
# File of size 20 should be named grumpy.txt
# File of size 10 should be named happy.txt
mv 'file1.txt' 'happy.txt'
mv 'file2.txt' 'grumpy.txt'
mv 'file3.txt' 'doc.txt'
mv 'file4.txt' 'dopey.txt'
Как только вы будете довольны результатом, отправьтеприведенная выше команда sh для выполнения изменений:
$ awk -f ~/rename.awk <(ls -l ../dir2) <(ls -l) | sh
Примечания:
- Нет защиты от файлов с таким же размером.Для этого решение MD5, которое предложил wonk0, работает лучше.
- Пожалуйста, проверьте вывод перед фиксацией.Изменения постоянны.