我有一个充满文件名和目录名的文件。 例如:
DIR,/mnt/sdcard/mydir1/
DIR,/mnt/sdcard/mydir2/
DIR,/mnt/sdcard/mydir3/
FILE,/mnt/sdcard/mydir1/file1.txt
FILE,/mnt/sdcard/mydir2/file1.txt
FILE,/mnt/sdcard/mydir3/file1.txt
总共有大约30.000个目录和文件名条目。 我需要在指定的文件夹中创建所有目录,子目录和文件(空的)。我还想跳过已经存在的所有目录/文件!
目前我有这个,但我希望有更好的方法,因为这很慢 并消耗大量的CPU:
#!/bin/bash
cd /home/mydir/dummydir/
for file in *.tree.txt; do
MEMBER=$(echo $file | cut -d '.' -f1)
DIRECTORY=/home/mydir/dummydir/$MEMBER
while read line
do
if [[ $line == FILE,* ]]
then
CUTOFFILE=$(echo "$line" | cut -c 6-)
touch "$DIRECTORY$CUTOFFILE"
else
CUTOFFDIR=$(echo "$line" | cut -c 5-)
if [[ ! -d "$DIRECTORY$line" && $line == DIR,* ]]; then
mkdir -p "$DIRECTORY$CUTOFFDIR"
fi
fi
done < $file
done
答案 0 :(得分:3)
#!/bin/bash
cd /home/mydir/dummydir/
for file in *.tree.txt; do
dir=${file%.tree.txt}
while IFS=, read type path; do
case $type in
FILE) touch "$dir/$path";;
DIR) mkdir -p "$dir/$path";;
*) echo "bad line: $type,$path" >&2;;
esac
done < "$file"
done
我不是cut
的忠实粉丝,所以我用其他解析方法取而代之。
每行包含两个以逗号分隔的字段,您可以通过read
解析该行并将这两个部分存储在单独的变量中来删除大量代码。您可以通过使用$IFS
暂时覆盖IFS=,
变量,告知read
使用,
作为字段分隔符来执行此操作。然后read type path
将这两部分读入$type
和$path
。
touch
和mkdir -p
在应用于已存在的文件或目录时都无害,因此您可以省略对现有文件的检查,并始终执行这些操作。
由于您通过cd
/home/mydir/dummydir
启动了该脚本,因此您不需要在以后重复此操作。
${file%.tree.txt}
是剥离.tree.txt
的较短方式。另一种方式是$(basename "$file" .tree.txt)
。