尝试在目录和所有子目录下查找具有特定命名结构的所有文件,并使用awk解析出我想要的数据。只要文件夹或文件的名称中没有空格,我就能得到它。
我首先使用find来查找文件并将它们放在一个数组中。然后我使用数组作为awk的文件名。但是数组会将任何空格视为不同的元素,因此它会将/Documents/Untitled Folder/file.txt
拆分为/Documents/Untitled
和Folder/file.txt
任何方式推送可能还包含空格的文件?到目前为止,这是有效的,如果没有没有空格的文件/目录/子目录。
arrFindFiles=($(find . -name "f*.txt" | sed 's/\ /\\\ /g'))
arrData+=("$(awk -F , '{if($9$10!=NULL) a[$9$10$13]++ } END { for (b in a) { print b } }' ${arrFindFiles[@]})")
非常感谢任何帮助!
答案 0 :(得分:0)
让我猜一下。
生成一个临时文件,列出当前文件夹中的所有txt文件。
$ find . -type f -name "f*.txt" > temp.txt
$ cat temp.txt
./b/f ab.txt
./b/fa.txt
./f a b.txt
./fab.txt
然后运行awk命令找出重复的名称。
awk -F \/ '{a=$0;b=$NF;gsub(/ /,"",$NF);c[$NF]=c[$NF]==""?a:c[$NF] OFS a;d[$NF]++}
END{for (i in d) if (d[i]>1) print "found duplicate name: \n" c[i]}' OFS=" | " temp.txt
found duplicate name:
./b/f ab.txt | ./f a b.txt | ./fab.txt
答案 1 :(得分:0)
对于使用带空格的文件的第一行,只需将eval放在前面:
eval arrFindFiles=($(find . -name "f*.txt" | sed 's/\ /\\\ /g'))
要使第二行工作,请将双引号仅放在${arrFindFiles[@]}
:
arrData+=($(awk -F, '{ if ($9$10!=NULL) a[$9$10$13]++ } END { for (b in a) { print b } }' "${arrFindFiles[@]}"))