我已经编写了以下代码,以在子目录中的文件中添加一些列,并合并目录中的所有文件,
#!/bin/bash
for sub in *
do
find . -name '*.bed' > log.txt
while read path
do
filename=$(basename "$path" | cut -d"." -f1)
echo $filename
awk -F't' '{print $1"t"$2"t"$3"t""'$filename'""t"$5"t"$6"t"$7}' $path > temp.dat
mv temp.dat $path
find . -iname '*.bed' -exec cat {} ; > $f.txt
mv $sub.txt $sub.bed
done < log.txt
rm log.txt
done
然而,问题是,当我循环遍历主目录时,它会拾取子目录以及文件,我尝试应用检查$ sub是否为目录的过滤器,但是它似乎不起作用不知何故。所以这是文件层次结构主目录 ->子目录 -> subsubdirectories->文件
外观:
#!/bin/bash
for sub in *
do
find . -name '*.bed' > log.txt
# ...
done
您正在从基本目录一遍又一遍地重复相同的find
命令。您可能想做的是:
#!/bin/bash
for sub in */
do
find "$sub" -name '*.bed' > log.txt
# ...
done
以这种方式,您将为每个子目录一次运行find
。
*/
确保您只将目录作为循环参数,谢谢Glenn-Jackman
编辑:,正如David W和Charles Duffy指出的那样,可以使用此结构跳过外循环和log.txt
:
find */ -name '*.bed' -print0 | while IFS='' read -r -d '' path; do
# Do stuff to $path as before ...
done