使用“touch”创建目录 - 递归创建目录的“影子”副本

使用“touch”创建目录 - 递归创建目录的“影子”副本
  1. 在“A”目录中: find . -type f > a.txt
  2. 在“B”目录中: cat a.txt | while read FILENAMES; do touch "$FILENAMES"; done

结果:步骤 2“创建文件”(我的意思是仅具有相同的文件名,但大小为 0 字节)但是如果“A”目录中有子目录,则步骤 2 无法在子目录中创建文件,因为其中没有目录。

问题:有没有办法,“触摸”可以创建目录?

答案1

快速拍摄:

while read FILENAME
do
  mkdir -p $(dirname "$FILENAME") && touch "$FILENAME"
done < a.txt

注意文件/路径名等中的特殊字符(空格,...)...

答案2

我正处于GNU并行最近踢了。下面是使用该工具在一行中完成此操作的方法:

find A -type d | parallel 'mkdir -p B/$(dirname {})' && find . -type f | parallel 'touch B/{}'

请注意,这样做效率低下,因为它会运行大量不必要的mkdir -p中间目录。如果您要处理非常庞大的目录结构,则应该对此进行优化。

答案3

在原来的“A”目录中:

find . -type f > a.txt

“B”目录:

while read file; do if [[ "$file" = */* ]]; then mkdir -p "${file%/*}"; fi; touch "$file"; done < a.txt

答案4

做之前:

cat a.txt | while read FILENAMES; do touch "$FILENAMES"; done

做:

cat a.txt | sed -e `s|/[^/]*$||` | uniq | while read DIRNAMES; do mkdir -p "$DIRNAMES"; done

正如已经指出的那样,要小心目录名/文件名中的特殊字符,尤其是斜杠(我不喜欢有一个名为“aaa/ccc”的文件,但这总是可能的)。

相关内容