0

我有一个充满文件名和目录名的文件。例子:

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
4

1 回答 1

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=,which tellread用作,字段分隔符来做到这一点。然后read type path将这两部分读入$type$path

  • touch当应用于已经存在的文件或目录时,两者mkdir -p都是无害的,因此您可能会省略对现有文件的检查并始终进行检查。

  • 由于您通过cding to启动脚本/home/mydir/dummydir,因此您以后不需要重复。

  • ${file%.tree.txt}是一种较短的剥离方式.tree.txt。另一种方式是$(basename "$file" .tree.txt)

于 2013-08-22T16:02:52.803 回答