Пример. У меня есть входной каталог с двумя ветвями на 2-м уровне (2 и 22)
~/input_directory/1/2/3/4/5/6
~/input_directory/1/22/3/4/5/6
Я хочу запустить команду для заполнения ~/output_directory
одноуровневого подкаталога, содержащего (пустые) подкаталоги с этими именами, поэтому единственный подкаталог в output_directory просто сводится к следующему:
./1 ./2 ./22 ./3 ./4 ./5 ./6
Исходный input_directory не изменился.
С использованием
find . -type d -exec echo {} \;
урожайность
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/22
./1/22/3
./1/22/3/4
./1/22/3/4/5
./1/22/3/4/5/6
Я думал, это сработает:
find . -type d -maxdepth 10 -print0 | xargs -0 mkdir -p ~/output_folder
но, к сожалению, нет (с опцией -maxdepth, которую я добавил на всякий случай, или без нее).
find . -type d -maxdepth 10 -print0 | xargs -0 ls -al
выполняется правильно, так что почти получилось?
Благодарен за помощь.
решение1
Не уверен, что это то, что вы хотите, так как я не совсем понимаю, зачем вам это нужно, но вы можете попробовать это.
[user@host ~]$ ls 1
2 22
[user@host ~]$ ls -R 1
1:
2 22
1/2:
3
1/2/3:
4
1/2/3/4:
5
1/2/3/4/5:
6
1/2/3/4/5/6:
1/22:
3
1/22/3:
4
1/22/3/4:
5
1/22/3/4/5:
6
1/22/3/4/5/6:
А теперь попробуйте запустить это:
mkdir output_directory; find 1 -type d -exec echo {} \; > dirs.txt; for dir in $(cat dirs.txt); do if [ ! -d output_directory/${dir##*/} ]; then mkdir output_directory/${dir##*/}; fi; done;
[user@host ~]$ ls output_directory/
1 2 22 3 4 5 6
решение2
Из замечательного ответа Данилы, это моя окончательная версия.
find . -type d -exec echo {} \; > /tmp/tempdirs.txt; \
for dir in $(cat /tmp/tempdirs.txt); do \
if [ ! -d ~/output_directory/${dir##*/} ]; then \
mkdir -p ~/output_directory/${dir##*/}; \
fi; \
done;
решение3
Вы можете использовать , basename
чтобы просто взять последнюю часть пути, найденного с помощью find
, вывести результаты, разделенные нулем, и использовать xargs
with replace-str
( -I
), чтобы добавить базовое имя в выходной каталог.
find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}