例如,我有如下输入目录,其中第二级有两个分支(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
根据 Danila 的精彩回答,这是我的最终版本。
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
( replace-str
)-I
将基本名称附加到输出目录。
find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}