[英]Looping through directories
我有一個類似的目錄結構,我循環遍歷目錄,但得到錯誤無法找到目錄任何想法? 在第一個目錄中它正在尋找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
立即引起我注意的一個問題是你在一個循環中進行cd
,並且你沒有從該目錄中出來進行下一次迭代。
所以,你cd
到~/new/subtle1/fooA
,做一些工作,然后你在那個目錄里已經下一次迭代,而你想在你原來的(起始)點。
我會看看pushd
/ popd
。 pushd
就像cd
一樣工作,但是它維護着一堆被訪問的目錄,而popd
會把你帶回到那個堆棧中。
例如
$ pwd
/home/brian
$ pushd /var/log
$ pwd
/var/log
$ popd
$ pwd
/home/brian
如果您只想以這種方式更改文件名:
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
如果您真的想通過腳本執行此操作並使用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.