我有一个类似的目录结构,我循环遍历目录,但是得到错误无法找到目录任何想法?在第一个目录中它正在寻找dir1 dir2 dir3等等,在第二个dir1中它正在寻找dirA dir B和dirC谢谢。
./subtle1/
/fooA/file.txt
/fooB/file.txt
/fooC/file.txt
./subtle2/
/fooA/file.txt
/fooB/file.txt
/fooC/file.txt
for i in ~/new/subtle*;
do
if [ -d "$i" ] ;
then
cd $i
for j in "$i"/foo* ; do
if [ -d "$j" ] ;
then
cd $j
mv file.txt $i.$j.file.txt
done
done
答案 0 :(得分:1)
立刻让我感到困惑的一个问题是你在循环中cd
,并且在下一次迭代中你不会从该目录中出来。
所以你cd
~/new/subtle1/fooA
进入pushd
,做一些工作,然后在下一次迭代中你已经在那个目录中,而你想要在原来的(开始)点。
我会查看popd
/ pushd
。 cd
的工作方式与popd
类似,但它维护着一堆访问过的目录,而$ pwd
/home/brian
$ pushd /var/log
$ pwd
/var/log
$ popd
$ pwd
/home/brian
会将您带回到该堆栈中。
e.g。
{{1}}
答案 1 :(得分:1)
如果您只想改变文件名:
mv ./subtle1/fooB/file.txt ./subtle1/fooB/subtle1.fooB.file.txt
mv ./subtle1/fooA/file.txt ./subtle1/fooA/subtle1.fooA.file.txt
mv ./subtle1/fooC/file.txt ./subtle1/fooC/subtle1.fooC.file.txt
mv ./subtle2/fooB/file.txt ./subtle2/fooB/subtle2.fooB.file.txt
mv ./subtle2/fooA/file.txt ./subtle2/fooA/subtle2.fooA.file.txt
mv ./subtle2/fooC/file.txt ./subtle2/fooC/subtle2.fooC.file.txt
比你需要的只是:
find -type f -print|sed -r -e 's/\.\/(.+)\/(.+)\/(.+)/\0 .\/\1\/\2\/\1.\2.\3/'|xargs -n 2 mv
答案 2 :(得分:0)
如果您真的想通过脚本执行此操作并使用cd
四处走动,请尝试以下操作:
#!/bin/bash
for sub in subtle*; do
if [ -d "${sub}" ]; then
cd ${sub}
for foo in foo*; do
if [ -d "${foo}" ]; then
cd ${foo}
pwd
echo mv -- file.txt ${sub}.${foo}.file.txt
cd ..
fi
done
cd ..
fi
done
您可以删除pwd
和echo
以执行mv
。