bash / linux - 从文件中的字符串触摸/ mkdir

时间:2013-08-22 15:57:01

标签: linux bash scripting touch mkdir

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

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

1 个答案:

答案 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

  • touchmkdir -p在应用于已存在的文件或目录时都无害,因此您可以省略对现有文件的检查,并始终执行这些操作。

  • 由于您通过cd /home/mydir/dummydir启动了该脚本,因此您不需要在以后重复此操作。

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