Рейтинг:0

Скопируйте только файлы из списка в новый каталог из большой структуры каталогов

флаг in

У меня огромная коллекция фотографий цветов, так как я готовлю книгу. Я буду использовать только некоторые из них, содержащиеся в файле selected.txt (на самом деле это csv). Я должен выбрать выбранные из дерева папок, организованного таким образом:

Картинки
🌸Цветы 2020
❗️❗️❗️❗️❗️❗️ 1.- Весна 2020
2. Лето 2020 г.
âââ 3.- Осень 2020
âââ 4.- Зима 2020
🌸Цветы 2021
    ââ 1.- Весна 2021 г.
    âââ 2.- Лето 2021
    âââ 3.- Осень 2021
    âââ 4.- Зима 2021 г.

10 каталогов, 5260 файлов

и скопируйте каждое выбранное изображение цветка в новую папку под названием Chosen-ones (например). Надеюсь, я правильно объяснил, что мне нужно сделать.

Ниже приведены некоторые строки CSV-файла. выбранный.txt

DSC10233.jpg
DSC10276.jpg
DSC10288.jpg
DSC10399.jpg
DSC10448.jpg
DSC10489.jpg
DSC10492.jpg

Возможно ли использовать Bash или, может быть, скрипт Python?

Заранее спасибо.

флаг br
@Vidal кажется, что вы ответили на комментарии выше, и последнее, что имена файлов в `chosen.txt` будут уникальными?
user535733 avatar
флаг cn
Конечно, это возможно... но обучение тому, как писать сценарии, может занять больше времени, чем простое выполнение этой работы позже в рабочем процессе. Например, вам, вероятно, все равно придется просматривать каждое изображение вручную во время макета каждой страницы, и это может быть лучшим временем для копирования фотографий в отдельный файл (или непосредственно в рукопись).
Рейтинг:3
флаг kr

Конечно, вы можете сделать это с помощью очень маленького скрипта Bash.

Я предполагаю, что у вас есть список выбранный.txt в вашем домашнем каталоге, в котором Pictures является подкаталогом. Если это не так, измените пути соответствующим образом.

Сначала создайте каталог для перемещения файлов. Я предполагаю, что вы только что открыли терминал и находитесь в своем домашнем каталоге. Вы можете переместить каталог позже.

mkdir Избранные

Теперь проверьте, можете ли вы найти правильные файлы, используя свой список следующим образом:

при чтении строки -r; найти картинки -name "$line" -ls; сделано < выбрано.txt

Если результат выглядит правильно, вы можете скопировать файлы, изменив команду:

при чтении строки -r; найдите изображения -name "$line" -exec cp -vt ChosenOnes {} \; ; сделано < выбрано.txt

Мы можем сделать это немного лучше:

#!/бин/баш
# прочитайте наш список и
при чтении строки -r; делать
  # находим в нем файлы и копируем их в новый каталог
  найти картинки -name "$line" -exec cp -vt ChosenOnes {} \;
сделано < выбрано.txt

Объяснение

  • при чтении строки -r; заниматься вещами; сделано <входной-файл А пока цикл продолжает что-то делать, пока выполняется условие. Здесь мы просим, ​​чтобы наш список читался построчно. Каждая строка будет помещена в переменную линия так что мы можем запустить некоторые команды на нем. Когда мы закончим с нашей командой (командами) в этой строке, будет прочитана следующая строка, пока в нашем файле не закончатся строки.
  • найти путь-имя "$line" найти Команда выполняет рекурсивный поиск по заданному пути (в нашем случае — по картинкам). Здесь мы используем -имя возможность найти файлы, соответствующие именам в списке.
  • -ls найти Команда имеет возможность вывести список найденных файлов. Это полезно для проверки того, что было найдено, прежде чем предпринимать какие-либо действия.
  • -exec команда {} \; -exec опция find запускает данную команду для найденных файлов (представленных {})
  • ср -vt -v вариант делает ср расскажи нам, что он делает. option указывает место назначения (директорию назначения мы указываем сразу после нее); в противном случае пункт назначения будет считаться последним аргументом.
Рейтинг:2
флаг ar

Да, есть несколько способов сделать это в командной строке.

Предполагая, что у вас есть только список имен файлов (без пути), вы можете использовать пока цикл, чтобы прочитать ваш файл «chosen.txt», найти чтобы найти файлы в исходной папке, а другой пока цикл, чтобы скопировать их.

Определение переменных позволяет повторно использовать длинную команду без ее редактирования.

list="/path/to/chosen.txt"
источник="/путь/к/изображениям"
dest="/путь/к/пункту назначения"
кот "chosen.txt" \
| пока читал; делать 
      найти "$source" -имя "$n" \
      | при чтении f; делать
            cp "$f" "$dest/"
        сделано
  сделано

Или в одной строке:

кот "chosen.txt" | пока читал; найдите "$source" -name "$n" | при чтении f; do cp "$f" "$dest/"; сделано; сделано

В качестве альтернативы, если ваш исходный файл .csv также содержит путь к файлам, можно было бы создать список из него. Тогда вы могли бы использовать rsync с --файлы-от= возможность копировать их, сохраняя исходную структуру каталогов источника.

Zanna avatar
флаг kr
О, мне нравится идея `rsync`. Ваш скрипт мне подходит.
Vidal avatar
флаг in
Мне также понравилась идея rsync, но, к сожалению, в этом случае в списке не было пути к нужным файлам.
флаг ar
@Vidal: если в списке нет пути, он есть в выводе команды find.Так что это можно использовать для создания нового списка или напрямую передать в rsync.
Vidal avatar
флаг in
Спасибо. Я уже отметил вопрос как решенный с помощью цикла while. Тем не менее, я попробую это также с rsync, так как мне очень нравится эта команда.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.