shellfor遍歷目錄
㈠ 如何用shell遍歷一個目錄下的所有子目錄
SAVEIFS="$IFS"
IFS="
"
hypen="------------------------------------------------------------------------------------"
printhypen()
(
tab=$(($1*4))
if[$tab-gt0]
then
printf"%-.${tab}s""$hypen"
fi
)
traverdir()
(
pushd"$1">/dev/null2>&1
tab="$2"
forfilein`ls-1`
do
iftest-d"$file"
then
printhypen$tab
echo"<dir>$file"
traverdir"$file""$((tab+1))"
else
printhypen$tab
echo"$file"
fi
done
popd>/dev/null2>&1
)
read-p"請輸入要遍歷的目錄:"dir
traverdir"$dir"0
IFS="$SAVEIFS"
㈡ linux shell 命令怎麼遍歷目錄
先設定實驗環境:
# 造 5 個 目錄,每個目錄下,造 3 個 文件和兩個子目錄如下:
cd $HOME/tmp
for i in d1 d2 d3 d4 d5
do
mkdir -p $i
touch $i/1.txt $i/2.txt $i/3.txt
mkdir -p $i/tmp1 $i/tmp2
done
# 檢驗測試環境:
$ ls -lR d1
total 0
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 2.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 3.txt
drwxr-sr-x 2 wenlee comm 256 Dec 22 10:35 tmp1/
drwxr-sr-x 2 wenlee comm 256 Dec 22 10:35 tmp2/
# 利用下列腳本來實現你要做的:
cd $HOME/tmp
for i in */1.txt
do
echo "Found $i, save $i and remove everything else under $(dirname $i)/"
save_this_file=$(basename $i)
curr_dir=$(dirname $i)
# 把這個1.txt暫時存到/tmp裡面去,為了避免已經有同樣的檔案名稱在/tmp,加上$$ (i.e. PID)
mv $i /tmp/${save_this_file}.$$
rm -rf $curr_dir
mkdir -p $curr_dir
mv /tmp/${save_this_file}.$$ $curr_dir
done
# 屏幕執行輸出如下:
Found d1/1.txt, save d1/1.txt and remove everything else under d1/
Found d2/1.txt, save d2/1.txt and remove everything else under d2/
Found d3/1.txt, save d3/1.txt and remove everything else under d3/
Found d4/1.txt, save d4/1.txt and remove everything else under d4/
Found d5/1.txt, save d5/1.txt and remove everything else under d5/
# 復驗實驗環境:
$ ls -l d?/*
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d1/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d2/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d3/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d4/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d5/1.txt
OK?
thanks!
㈢ 用shell層級遍歷dir目錄,統計文件總數量、總大小,並按擴展名分類統計各種文件的數目、總大小。
#!/bin/bash
functiondirectory(){
forfilein$(ls$1)
do
basepath="$1/$file"
if[-d"$basepath"];then
echo"|-directory:$file"$(-h$basepath|cut-f1)
directory$basepath
elif[-f"$basepath"];then
echo"|--file:$file"$(-h$basepath|cut-f1)
fi
done
}
directory$1
調用方法:./testfind.sh你要遍歷的路徑
我只是簡單的寫了一個,大致功能的思想如此,你也可以在此基礎上進行擴展,不過好像應該有
現成的,你網上搜一搜吧。。
㈣ 我用shell編寫的遍歷當前目錄及所有子目錄找mac.c這個文件,有問題希望大家幫忙看一下
elif["$file"="mac.c"]
這句判斷表達式里少了一個空格。
應為:
elif["$file"="mac.c"]
㈤ shell 遍歷目錄,提取所有特定文件U,復制出來並重命名
@echooff
for/f"delims="%%ain('dir/ad/b')do(
pushd%%a
for/f"delims="%%bin('dir/a-d/b/sU')do(
"%%b""另一個文件夾\%%a_%%b"
)
popd
)
保存為.bat文件,放在C:UsersA下執行
㈥ linux shell中的遍歷目錄並刪除目錄下與目錄名相同的文件
;do
if[-d/$i/$i];then
rm-rf/$i/$i
fi
done
代碼如上,但如樓上所說,!慎用 !
㈦ shell 循環遍歷目錄問題
當while讀取管道輸出的結果時,肯定會出現這樣的問題。
因為使用for,while,until,if,case這些命令時用到了管道,那麼bash會產生一個子shell來運行它們。可以想像count在循環體中能夠正確的計數,一旦while執行完畢,子shell完成,其內部的變數count就消失了。因而得到的結果是循環體外echo永遠是0!
之前也遇到過這樣的問題,網上找的一些解決方法不是太理解,我就用了一個比較笨的辦法:
先將ls /var/tmp/tomcat-logs -1的結果寫到文件,再用while來讀文件來計數,用完後再將臨時文件刪除即可。
ls /var/tmp/tomcat-logs -1 >/tmp/test.txt
while read fn; do
echo $count
customer[$count]=$fn
echo ${customer[$count]}
count=$[$count+1]
done </tmp/test.txt
echo $count
rm /tmp/test.txt
㈧ 在windows中用shell遍歷一個文件夾下得所有文件並對文件執行同一個指令
你的for循環中循環的是$PATH ,他只是代表這個路徑,並不表示裡面的文件名。
㈨ shell 遍歷目錄中所有文件 改名
#!/bin/bash
base_dir=$(dirname$0)
fordirin$(ls$base_dir);do
current_dir="$base_dir/$dir"
if[!-d$current_dir];then
continue
fi
forold_file_namein$(ls$current_dir);do
old_file="$current_dir/$old_file_name"
if[!-f$old_file];then
continue
fi
new_file_name="$current_dir/${old_file_name}_${dir}"
mv$old_file$new_file_name
done
done
改名的部分幫你寫了,放到把腳本放到你說的有好多目錄的那個目錄里執行就可以了
資料庫的部分自己想吧
㈩ shell怎麼遍歷一個文件夾下所有文件
# find . -type f
./a
./normal/log-1
./normal/log-2
./normal/log-3
通過find找到文件
那麼遍歷就用循環
for i in `find . -type f`
do
echo $i
done