Как я могу использовать команды терминала / Linux для рекурсивного поиска на диске изображений (jpg) и скопировать их на мой рабочий стол, переименовав все найденные файлы с помощью чисел. Таким образом, первый раз, когда он находит, должен быть скопирован на рабочий стол как 1.jpg, второй файл должен быть скопирован как 2.jpg, а 50 000-й файл должен быть скопирован как 50000.jpg и так далее.
2 ответа
2
n=1; for file in $(find /media/foo/ -name '*.jpg'); do cp $file ~/Desktop/$n.jpg; n=$((n + 1)); done
0
Здесь есть две проблемы.
- Нахождение набора файлов JPEG.
- Копирование набора файлов в целевой каталог с последовательными пронумерованными именами.
Для первой проблемы очевидное и правильное решение - find
, что, к счастью, делает это очень легко.
find / -type f -iregex '.*\.jpe?g$'
Конечно, это можно сделать более изощренным, если вы хотите, например, определить тип с помощью file
а не по расширению.
Вторая проблема - последовательное копирование. Простой счетчик - это все, что необходимо для этой работы.
n=1
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
Делая это внутри цикла, где $source
меняется на каждой итерации.
Собираем все вместе
#!/usr/bin/env bash
usage() {
echo "$0: usage: $0 [source directory] [destination directory]"
}
if [ ${#@} -ne 2 ] ; then
usage
exit
fi
scan="$1"
dest="$2"
if [ ! -d "$scan" ] ; then
usage
printf "\nspecified source does not exist or is not a directory\n"
exit
fi
if [ ! -d "$dest" ] ; then
usage
printf "\nspecified destination does not exist or is not a directory\n"
exit
fi
n=1
while read -r -d $'\0' source ; do
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
done < <(find "$scan" -type f -regextype posix-extended -iregex '.*\.jpe?g$' -print0)
Примечание по переносимости: -regextype
- это расширение поиска GNU; без него -iregex
может не совпадать с именами файлов, содержащих переводы строк.