[英]BASH loop through folders and files
我在通過目錄列出時遇到問題。 我想制作一個腳本,該腳本將遍歷目錄中的目錄和文件,以便將它們移至其他位置。
我的問題是我需要對文件夾中的所有文件進行排序。 大約有2000個目錄,我需要遍歷它們,然后遍歷這些目錄中的所有文件,並按擴展名對它們進行排序,該目錄將被創建(或文件將被移動),名稱將是該特定擴展名
有人可以幫忙嗎?
#!/bin/bash
tar_fol="$HOME/Desktop/try/"
to_fol="$HOME/Desktop/SortedFiles/"
for DIRE in "$(ls -d $tar_fol"*")"
do
echo "Checking dir : $DIRE"
for FIL in "$(ls -p $tar_fol$DIRE)"
do
echo "Checking file : $FIL"
if [ "$(find ~/Desktop/ -type d -name ${FIL##*.})" != "" ]
then
mv -f $tar_fol$FIL $to_fol${FIL##*.}
else
mkdir $to_fol${FIL##*.}
mv $tar_fol$FIL $to_fol${FIL##*.}
fi
done
done
您引用的通配符,所以你正在尋找的文件名稱以字符字面結束*
。
無論如何, 您不應使用ls
來驅動循環 ,並且,也應避免對私有變量使用大寫字母。
#!/bin/bash
tar_fol="$HOME/Desktop/try/"
to_fol="$HOME/Desktop/SortedFiles/"
for dire in "$tar_fol"/*/.
do
echo "Checking dir: '$dire'"
for fil in "$dire"/*
do
echo "Checking file: '$fil'"
find ~/Desktop/ -type d -name "${fil##*.}" -exec sh -c 'mkdir -p "$0";
mv "$@" "$0"' "$to_fol" "$fil" {} \+
done
done
我不確定我是否完全了解最內層的循環應該完成什么,所以在那里有些猜測。 一般的想法是將目標目錄傳遞給$0
(晦澀的hack,但這很普遍),然后將找到的文件傳遞給-exec
腳本。
您可以使用ls
命令
cd $HOME/Desktop/try/
ls -laRX
要么
ls -laRX $HOME/Desktop/try/
-l use a long listing format
-a, --all do not ignore entries starting with .
-R, --recursive
list subdirectories recursively
-X sort alphabetically by entry extension
請參閱man ls
以獲取更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.