gpt4 book ai didi

linux - bash/linux - touch/mkdir 来自文件中的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:34 28 4
gpt4 key购买 nike

我有一个包含文件名和目录名的文件。示例:

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

最佳答案

#!/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 在应用于已经存在的文件或目录时都是无害的,因此您可以忽略对现有文件的检查,而只是总是这样做。

  • 由于您是通过cding 到/home/mydir/dummydir 来启动脚本的,所以您实际上不需要稍后重复。

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

关于linux - bash/linux - touch/mkdir 来自文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18385438/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com