2

Как я могу использовать команды терминала / Linux для рекурсивного поиска на диске изображений (jpg) и скопировать их на мой рабочий стол, переименовав все найденные файлы с помощью чисел. Таким образом, первый раз, когда он находит, должен быть скопирован на рабочий стол как 1.jpg, второй файл должен быть скопирован как 2.jpg, а 50 000-й файл должен быть скопирован как 50000.jpg и так далее.

2 ответа2

2
n=1; for file in $(find /media/foo/ -name '*.jpg'); do cp $file ~/Desktop/$n.jpg; n=$((n + 1)); done
0

Здесь есть две проблемы.

  1. Нахождение набора файлов JPEG.
  2. Копирование набора файлов в целевой каталог с последовательными пронумерованными именами.

Для первой проблемы очевидное и правильное решение - 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 может не совпадать с именами файлов, содержащих переводы строк.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .