Перемещение файлов с рисунком по имени в папку с тем же рисунком, что и его имя - PullRequest
0 голосов
/ 13 марта 2020

Мой каталог содержит несколько сотен файлов и каталогов, подобных этому:

508471/
ae_lstm__ts_ 508471_detected_anomalies.pdf
ae_lstm__508471_prediction_result.pdf
mlp_508471_prediction_result.pdf
mlp__ts_508471_detected_anomalies.pdf
vanilla_lstm_508471_prediction_result.pdf
vanilla_lstm_ts_508471_detected_anomalies.pdf

598690/
ae_lstm__ts_598690_detected_anomalies.pdf
ae_lstm__598690_prediction_result.pdf
mlp_598690_prediction_result.pdf
mlp__ts_598690_detected_anomalies.pdf
vanilla_lstm_598690_prediction_result.pdf
vanilla_lstm_ts_598690_detected_anomalies.pdf

Есть папки с идентификатором в качестве их имен, например, 508471 и 598690.
По тому же пути, что и В этих папках есть pdf файлы, которые имеют этот идентификационный номер как часть своего имени. Мне нужно переместить все файлы pdf с одинаковыми именами в их именах в соответствующие каталоги.

Я пробовал следующий сценарий оболочки, но он ничего не делает. Что я делаю не так?
Я пытаюсь l oop по всем каталогам, найти файлы с id в названии и переместить их в тот же каталог:

for f in ls -d */; do
    id=${f%?}  # f value is '598690/', I'm removing the last character, `\`, to get only the id part 
    find . -maxdepth 1 -type f -iname *.pdf -exec grep $id {} \; -exec mv -i {} $f \;
done

Ответы [ 4 ]

2 голосов
/ 13 марта 2020
#!/bin/sh
find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '
    for d in "$@"; do
        id=${d#./}
        for file in *"$id"*.pdf; do
            [ -f "$file" ] && mv -- "$file" "$d"
        done
    done
' findshell {} +

Находит все каталоги внутри текущего (находя, например, ./598690). Затем он удаляет ./ из относительного пути и выбирает каждый файл, содержащий полученный идентификатор (598690), перемещая его в соответствующий каталог.

Если вы не уверены в том, что это будет делать, введите echo между && и mv, он будет перечислять mv действий, которые будет выполнять скрипт.

И помните, не анализировать ls.

1 голос
/ 13 марта 2020

Приведенный ниже код должен выполнить необходимую работу.

for dir in */; do find . -mindepth 1 -maxdepth 1 -type f -name "*${dir%*/}*.pdf" -exec mv {} ${dir}/ \;; done

, где */ будет рассматривать только каталоги, присутствующие в данном каталоге, find будет искать только файлы в указанном каталоге, который соответствует *${dir%*/}*.pdf то есть имя файла, содержащее имя каталога в качестве его подстроки и, наконец, mv скопирует соответствующие файлы в каталог.

0 голосов
/ 13 марта 2020

Вы можете использовать это for l oop из родительского каталога этих pdf-файлов и каталогов:

for d in */; do
    compgen -G "*${d%/}*.pdf" >/dev/null && mv *"${d%/}"*.pdf "$d"
done

compgen -G используется для проверки совпадения для данного глоба или нет.

0 голосов
/ 13 марта 2020

в Unix, пожалуйста, используйте приведенную ниже команду

find . -name '*508471*' -exec bash -c 'echo mv $0 ${0/508471/598690}' {} \;
...