Как «сжать» уровни каталога - PullRequest
3 голосов
/ 01 апреля 2020

У меня есть файлы данных, скрытые в глубоких структурах каталогов для многих идентификаторов, таких как:

ID1/a/b/c/data1
ID1/d/e/data2
ID1/f/g/h/i/data3

ID2/j/data1
ID2/k/l/m/data2

ID3/m/n/data1
ID3/o/data2
ID3/p/q/r/s/t/u/data3
ID3/v/w/data4
ID3/x/y/z/data5
...

Есть ли удобный способ «сжать» эти каталоги, чтобы файлы данных сразу помещались под каждым идентификатором? Нравится:

> ls ID1
data1 data2 data3

> ls ID2
data1 data2

> ls ID3
data1 data2 data3 data4 data5

Ответы [ 3 ]

4 голосов
/ 01 апреля 2020

Вы можете использовать шаблон, подобный следующему:

find ID1/*/ -type f -exec mv -t ID1 {} +

ID1/*/ - искать во всех каталогах ID1

-type f - искать только файлы

-exec mv -t ID1 - вызвать mv для найденных файлов и переместить их в каталог ID1

{} + - find заменит эти аргументы именами файлов при вызове mv


В al oop для охвата всех каталогов:

for dir in ID*/ ; do
    find $dir/*/ -type f -exec mv -t $dir {} +
done

Примечание: для пробелов в именах каталогов потребуется другое решение.

0 голосов
/ 01 апреля 2020

Второй оператор "find" для очистки пустых каталогов

for i in `ls`
do
  find $i -type f -exec mv {} $i \;
  find $i/* -d -type d -exec rmdir {} \; 
done
0 голосов
/ 01 апреля 2020

Вот возможный шаблон для систем, которые не поддерживают параметр mv -t:

find ID1/*/ -type f -print0 | xargs -0 -I{} mv {} ID1

-type f - искать только файлы

-print0 - выводить список файлов в стандартный вывод, разделенный символами NUL

Утилита xargs получит вывод от find на свой стандартный ввод. Варианты xargs:

-0 - принять разделенный NUL ввод

-I{} - использовать строку {}, чтобы указать xargs, где заменить шаблон командной строки с фактическим вводом (по одному за раз)

mv {} ID1 - команда mv, вызываемая xargs, где {} будет заменяться путем к одному файлу за раз. mv будет вызываться столько раз, сколько файлов будет передано из find.


В al oop для охвата всех каталогов:

for dir in ID*/ ; do
    find $dir/*/ -type f -print0 | xargs -0 -I{} mv {} $dir
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...