Рейтинг:0

Создание подпапок и перемещение файлов

флаг id

У меня есть папка с именем p/ и в p/ у меня есть несколько подпапок, например:

$[~/p] лс
а/ б/ в/

a/ b/ и c/ также имеют несколько вложенных папок. Я пытаюсь найти файл, соответствующий определенному шаблону, в каждой папке и подпапке p/ и переместить их в новый каталог в соответствующую папку a/, b/ и c/. Таким образом, a/ будет иметь новую подпапку с именем x/, и в x/ будут перемещены все совпадающие файлы, найденные в a/, b/ будет иметь новую подпапку с именем x/ и в x/ будут перемещены все найденные совпадающие файлы. в б/ и так далее.

Я пытался:

pth=путь/к/p

для каталога в ${pth}/*; делать 
    mkdir -- "$dir/x";
    найти . -name '*match*' -exec mv -t ./x '{}' +;
сделано

Однако это не работает, оно превращает подпапку x/ в a/, b/ и c/, но ничего не перемещает.

Я получил:

mv: не удалось получить доступ к './x': нет такого файла или каталога

Что я делаю не так?? Не могли бы вы мне помочь, пожалуйста?

muru avatar
флаг us
Вы сделали `mkdir -- "$dir/x"`, но затем использовали `./x` в команде `mv`.
bac0n avatar
флаг cn
Вы не должны использовать цель в начальной точке *find*, это может создать состояние гонки или, по крайней мере, исключить цель.
Рейтинг:0
флаг cn

Я предлагаю сделать это поэтапно, сначала создав каталоги. Затем найдите и систематизируйте результаты поиска. Поскольку ваша цель находится внутри поиска, вы должны обрезать цель, иначе это может привести к условиям гонки. Теперь мы могли бы обрабатывать один элемент за раз, но, поскольку он потребляет много ресурсов, обычно лучше организовать поиск, прежде чем перемещать их как мв принимает только одну цель, это ограничивает количество файлов, которые мы можем перемещать одновременно. В этом случае мы можем организовать поиск с помощью ассоциативного массива, где ключ становится целью. Файл будет назначен как строка. Важно заключать в кавычки любые специальные символы в имени файла, иначе, например, пробелы будут интерпретироваться как разделение слов (или разрыв каким-либо другим образом).

#!/бин/баш

встроенный компакт-диск p
printf %s/x\0 {a,b,c} | xargs -0 mkdir -p

объявить -A =()
в то время как IFS=/ читать -rd '' b c; делать
    a[${b@Q}/x]+=\ "${b@Q}/${c@Q}"
done < <(find -type d -path './*/x' -prune -false -o -type f -name '*.txt' -printf %P\0)

для k в "${!a[@]}"; делать
    eval printf '%s\0' "$k" "${a[$k]}" | xargs -0 мв --backup=t -t
сделано
Al_Mt avatar
флаг id
Извините, я новичок в терминале и не очень хорошо понимаю, что вы делаете, я попытался запустить то, что вы предложили, и он создал папки a, b, c (если они не существуют) и подпапку x внутри каждый, но он ничего не двигает. Кроме того, я не всегда знаю имена a/, b/ и c/, а в p/ у меня сотни папок, так как же в таком случае это можно изменить?

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

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