我是Linux的新手,也是编程的初学者,但已经能够将几行代码here拼凑在一起,用于将文件列表传递给for循环,并且{{ 3}}用于对文件夹执行相同操作。
# Run search.sh from base folder;
# Only interested in folders under base folder (e.g., baseFolder/FolderA)
# list all folders in base directory that match search parameters;
# cut out just the folder name; feed to variable DIR
DIR=$(find . -name *MTL.txt | cut -d '/' -f2)
# echo $DIR = "FolderA FolderB FolderC"
# place that information in a for-loop
for i in $DIR; do
cd $DIR # step into folder
# find specific file in folder for processing
FILE=$(find -name *MTL | cut -d '/' -f2)
# copy in a static file from another folder;
# rename file based on file name found in previous step
cp /baseFolder/staticfile.txt $FILE.new
do more stuff
cd .. # step out of directory
done
第一个目录的代码完好无损,但无法移入后续目录。我猜我的(很多)问题之一就是我不能像我一样将文件夹名称列表传递给$ DIR。这应该很简单,但我的foo很弱。
请告诉我,告诉我。
编辑:
将“cd $ DIR”更改为“cd $ i”具有所需的效果。代码现在遍历所有目录并在每个目录中正确执行操作。 -Thx to core1024用于标记上述内容。
答案 0 :(得分:4)
cd ..#step out of directory
只需升级一级。
在循环之前,您需要将“基本目录”存储在变量中:
BASEDIR=`pwd`
然后,你将执行
cd $BASEDIR # step out of directory
而不是你当前的
cd ..
答案 1 :(得分:1)
我不是专家,但我认为cd $DIR # step into folder
应该是cd $i # step into folder
答案 2 :(得分:0)
不需要" For循环"虽然。 find命令将遍历它找到的所有项目。
在find命令上有一个-exec选项,用于传递每个项目"找到"一个特定的命令。
e.g。
find . -name *MTL.txt -exec cp {} /basefolder \;
这会将找到的所有文件复制到/ basefolder
如果你对使用for循环感到强烈,你也可以使用命令的输出作为循环列表。
e.g。
for MYVAR in `ls *.txt* `
do
echo $MYVAR
done
使用剪切通常不是一个好主意,除非您正在格式化输出或具有不将其输出发送到stdout的命令。
答案 3 :(得分:0)
以下内容稍微简单一点,因为它不需要解析find
输出:
for subdir in *; do
if [[ ! -d $subdir ]]; then
continue
fi
cd $subdir
for f in *MTL.txt; do
cp /baseFolder/staticFile.txt $f.new
# And whatever else
done
cd ..
done
请注意,我只会下载到每个子目录中一次,原始代码会多次执行此操作。我指出这是为了你的意图。此外,由于您的cut
命令阻止您访问多个目录,我认为这是您的意图。
根据您执行的其他操作,您可以完全避免更改目录。例如:
for f in $subdir/*MTL.txt; do
cp /baseFolder/staticFile.txt $f.new
# More stuff
done
答案 4 :(得分:0)
如果目录名具有嵌入空格,则原始代码将中断。如果您有多个文件满足目录中的查找条件,您还将重复该操作。 替代方法:
IFS='
'
declare -a DIR
declare -a FILE
DIR=($(find . -name '*MTL.txt' | cut -f2 -d '/' | uniq))
for x in "${DIR[@]}"
do
if [ -d "$x" ]; then
pushd "$x"
FILE=($(ls *MTL))
for y in "${FILE[@]}"
do
cp /baseFolder/staticfile.txt "$y"
echo do more stuff
done
popd
fi
done