[英]How to move many files in multiple different directories (on Linux)
我的问题是单个目录中文件太多。 我不能“ ls
”目录,因为cos太大。 我需要将所有文件移动到更好的目录结构中。
我将ID的最后3位数字以相反的方式用作文件夹。
例如,ID 2018972
必须进入/2/7/9/img_2018972.jpg
。
我已经创建了目录,但是现在我需要有关bash脚本的帮助。 我知道ID,范围是1,300,000 - 2,000,000
。 但是我不能处理正则表达式。
我不会像这样移动所有文件:
/images/folder/img_2018972.jpg -> /images/2/7/9/img_2018972.jpg
感谢您在此问题上的帮助。 谢谢!
编辑 :在注释中进行解释后,存在以下假设:
img_<id>.jpg
或img_<id>_<size>.jpg
使用Bash:
for file in /images/folder/*.jpg; do
fname="${file%.*}" # remove extension and _<size>
[[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"
last0="${fname: -1:1}" # last letter/digit
last1="${fname: -2:1}" # last but one letter/digit
last2="${fname: -3:1}" # last but two letter/digit
newdir="/images/$last0/$last1/$last2"
# optionally check if the new dir exists, if not create it
[[ -d "$newdir" ]] || mkdir -p "$newdir"
mv "$file" "$newdir"
done
如果*
无法处理它(尽管我认为for循环中的*
没有限制),
使用@MichałKosmulski在评论中建议的find
while read -r; do
fname="${REPLY%.*}" # remove extension and _<size>
[[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"
last0="${fname: -1:1}" # last letter/digit
last1="${fname: -2:1}" # last but one letter/digit
last2="${fname: -3:1}" # last but two letter/digit
newdir="/images/$last0/$last1/$last2"
# optionally check if the new dir exists, if not create it
[[ -d "$newdir" ]] || mkdir -p "$newdir"
mv "$REPLY" "$newdir"
done < <(find /images/folder/ -maxdepth 1 -type f -name "*.jpg")
find /images/folder -type f -maxdepth 1 | while read file
do
filelen=${#file}
((rootn=$filelen-5))
((midn=$filelen-6))
((topn=$filelen-7))
root=${file:$rootn:1}
mid=${file:$midn:1}
top=${file:$topn:1}
mkdir -p /images/${root}/${mid}/${top}
mv $file /images/${root}/${mid}/${top}
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.