问题描述
在此代码中,我从用户那里获取文件夹的路径,然后输入该路径。
之后,我更改所有文件的名称和扩展名,无论它们的名称或扩展名是什么。
我将它们的名称更改为“pic”,计数器从 1 开始直到最后一个文件(以计算有多少文件),并将它们的扩展名更改为 jpg(例如)。
#!/bin/bash
echo "Enter Folder's Path :"
read path
cd $path
c=0
for file in *.*;do
mv "$file" "pic $((c=c+1)).jpg"
done
现在帮我为每(例如)10 个文件创建一个目录,并将这些文件(从 1 到 10、11 到 20 和...)移动到该特定目录。
解决方法
使用 mapfile
又名 readarray
,这是一个 bash4+ 功能。
#!/usr/bin/env bash
read -rp "Enter Folder's Path : " path
cd "$path" || exit
n=1
c=0
files=(*.*)
while mapfile -n10 -d '' -t array && ((${#array[*]})); do
mkdir -pv "directory$n" || exit
for file in "${array[@]}"; do
mv -v "$file" "directory$n/pic$c.jpg" || exit
((c++))
done
((n++))
done < <(printf '%s\0' "${files[@]}")
上面的脚本将执行以下操作:
-
它将使用所需的命名方案以增量重命名文件。
-
它将创建一个具有所需命名方案的目录,并带有增量
-
将每个目录中的文件移动 10 对。
-
如果还有剩余文件(少于 10 个),这些文件将放在最后一个目录中。就像您有
105
个文件一样,剩余的 5 个文件将进入directory11
目录中的其余文件,每个目录成对出现在目录 1 到 10 中。
应该启用 nullglob
shopt -s nullglob
还应添加检查目录是否为空。
还要检查您是否也在重命名目录。
脚本如何工作的示例。
首先在某处创建一些虚拟文件,比如 /tmp
[[ -d /tmp ]] && mkdir -p /tmp/testing/ && touch /tmp/testing/{1..21}.{pdf,csv,mp3,txt,rpm}
现在检查创建的虚拟文件。
ls /tmp/testing
输出
10.csv 11.csv 12.csv 13.csv 14.csv 15.csv 16.csv 17.csv 18.csv 19.csv 1.csv 20.csv 21.csv 2.csv 3.csv 4.csv 5.csv 6.csv 7.csv 8.csv 9.csv
10.mp3 11.mp3 12.mp3 13.mp3 14.mp3 15.mp3 16.mp3 17.mp3 18.mp3 19.mp3 1.mp3 20.mp3 21.mp3 2.mp3 3.mp3 4.mp3 5.mp3 6.mp3 7.mp3 8.mp3 9.mp3
10.pdf 11.pdf 12.pdf 13.pdf 14.pdf 15.pdf 16.pdf 17.pdf 18.pdf 19.pdf 1.pdf 20.pdf 21.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf
10.rpm 11.rpm 12.rpm 13.rpm 14.rpm 15.rpm 16.rpm 17.rpm 18.rpm 19.rpm 1.rpm 20.rpm 21.rpm 2.rpm 3.rpm 4.rpm 5.rpm 6.rpm 7.rpm 8.rpm 9.rpm
10.txt 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 1.txt 20.txt 21.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
运行脚本。 (假设您的脚本名称是 myscript.sh
并且它在当前的 pwd
中)
bash ./myscript.sh
输出
Enter Folder's Path :
键入包含虚拟文件的目录。
Enter Folder's Path : /tmp/testing
输出
mkdir: created directory 'directory1'
renamed '10.csv' -> 'directory1/pic0.jpg'
renamed '10.mp3' -> 'directory1/pic1.jpg'
renamed '10.pdf' -> 'directory1/pic2.jpg'
renamed '10.rpm' -> 'directory1/pic3.jpg'
renamed '10.txt' -> 'directory1/pic4.jpg'
renamed '11.csv' -> 'directory1/pic5.jpg'
renamed '11.mp3' -> 'directory1/pic6.jpg'
renamed '11.pdf' -> 'directory1/pic7.jpg'
renamed '11.rpm' -> 'directory1/pic8.jpg'
renamed '11.txt' -> 'directory1/pic9.jpg'
mkdir: created directory 'directory2'
renamed '12.csv' -> 'directory2/pic10.jpg'
renamed '12.mp3' -> 'directory2/pic11.jpg'
renamed '12.pdf' -> 'directory2/pic12.jpg'
renamed '12.rpm' -> 'directory2/pic13.jpg'
renamed '12.txt' -> 'directory2/pic14.jpg'
renamed '13.csv' -> 'directory2/pic15.jpg'
renamed '13.mp3' -> 'directory2/pic16.jpg'
renamed '13.pdf' -> 'directory2/pic17.jpg'
renamed '13.rpm' -> 'directory2/pic18.jpg'
renamed '13.txt' -> 'directory2/pic19.jpg'
mkdir: created directory 'directory3'
renamed '14.csv' -> 'directory3/pic20.jpg'
renamed '14.mp3' -> 'directory3/pic21.jpg'
renamed '14.pdf' -> 'directory3/pic22.jpg'
renamed '14.rpm' -> 'directory3/pic23.jpg'
renamed '14.txt' -> 'directory3/pic24.jpg'
renamed '15.csv' -> 'directory3/pic25.jpg'
renamed '15.mp3' -> 'directory3/pic26.jpg'
renamed '15.pdf' -> 'directory3/pic27.jpg'
renamed '15.rpm' -> 'directory3/pic28.jpg'
renamed '15.txt' -> 'directory3/pic29.jpg'
mkdir: created directory 'directory4'
renamed '16.csv' -> 'directory4/pic30.jpg'
renamed '16.mp3' -> 'directory4/pic31.jpg'
renamed '16.pdf' -> 'directory4/pic32.jpg'
renamed '16.rpm' -> 'directory4/pic33.jpg'
renamed '16.txt' -> 'directory4/pic34.jpg'
renamed '17.csv' -> 'directory4/pic35.jpg'
renamed '17.mp3' -> 'directory4/pic36.jpg'
renamed '17.pdf' -> 'directory4/pic37.jpg'
renamed '17.rpm' -> 'directory4/pic38.jpg'
renamed '17.txt' -> 'directory4/pic39.jpg'
mkdir: created directory 'directory5'
renamed '18.csv' -> 'directory5/pic40.jpg'
renamed '18.mp3' -> 'directory5/pic41.jpg'
renamed '18.pdf' -> 'directory5/pic42.jpg'
renamed '18.rpm' -> 'directory5/pic43.jpg'
renamed '18.txt' -> 'directory5/pic44.jpg'
renamed '19.csv' -> 'directory5/pic45.jpg'
renamed '19.mp3' -> 'directory5/pic46.jpg'
renamed '19.pdf' -> 'directory5/pic47.jpg'
renamed '19.rpm' -> 'directory5/pic48.jpg'
renamed '19.txt' -> 'directory5/pic49.jpg'
mkdir: created directory 'directory6'
renamed '1.csv' -> 'directory6/pic50.jpg'
renamed '1.mp3' -> 'directory6/pic51.jpg'
renamed '1.pdf' -> 'directory6/pic52.jpg'
renamed '1.rpm' -> 'directory6/pic53.jpg'
renamed '1.txt' -> 'directory6/pic54.jpg'
renamed '20.csv' -> 'directory6/pic55.jpg'
renamed '20.mp3' -> 'directory6/pic56.jpg'
renamed '20.pdf' -> 'directory6/pic57.jpg'
renamed '20.rpm' -> 'directory6/pic58.jpg'
renamed '20.txt' -> 'directory6/pic59.jpg'
mkdir: created directory 'directory7'
renamed '21.csv' -> 'directory7/pic60.jpg'
renamed '21.mp3' -> 'directory7/pic61.jpg'
renamed '21.pdf' -> 'directory7/pic62.jpg'
renamed '21.rpm' -> 'directory7/pic63.jpg'
renamed '21.txt' -> 'directory7/pic64.jpg'
renamed '2.csv' -> 'directory7/pic65.jpg'
renamed '2.mp3' -> 'directory7/pic66.jpg'
renamed '2.pdf' -> 'directory7/pic67.jpg'
renamed '2.rpm' -> 'directory7/pic68.jpg'
renamed '2.txt' -> 'directory7/pic69.jpg'
mkdir: created directory 'directory8'
renamed '3.csv' -> 'directory8/pic70.jpg'
renamed '3.mp3' -> 'directory8/pic71.jpg'
renamed '3.pdf' -> 'directory8/pic72.jpg'
renamed '3.rpm' -> 'directory8/pic73.jpg'
renamed '3.txt' -> 'directory8/pic74.jpg'
renamed '4.csv' -> 'directory8/pic75.jpg'
renamed '4.mp3' -> 'directory8/pic76.jpg'
renamed '4.pdf' -> 'directory8/pic77.jpg'
renamed '4.rpm' -> 'directory8/pic78.jpg'
renamed '4.txt' -> 'directory8/pic79.jpg'
mkdir: created directory 'directory9'
renamed '5.csv' -> 'directory9/pic80.jpg'
renamed '5.mp3' -> 'directory9/pic81.jpg'
renamed '5.pdf' -> 'directory9/pic82.jpg'
renamed '5.rpm' -> 'directory9/pic83.jpg'
renamed '5.txt' -> 'directory9/pic84.jpg'
renamed '6.csv' -> 'directory9/pic85.jpg'
renamed '6.mp3' -> 'directory9/pic86.jpg'
renamed '6.pdf' -> 'directory9/pic87.jpg'
renamed '6.rpm' -> 'directory9/pic88.jpg'
renamed '6.txt' -> 'directory9/pic89.jpg'
mkdir: created directory 'directory10'
renamed '7.csv' -> 'directory10/pic90.jpg'
renamed '7.mp3' -> 'directory10/pic91.jpg'
renamed '7.pdf' -> 'directory10/pic92.jpg'
renamed '7.rpm' -> 'directory10/pic93.jpg'
renamed '7.txt' -> 'directory10/pic94.jpg'
renamed '8.csv' -> 'directory10/pic95.jpg'
renamed '8.mp3' -> 'directory10/pic96.jpg'
renamed '8.pdf' -> 'directory10/pic97.jpg'
renamed '8.rpm' -> 'directory10/pic98.jpg'
renamed '8.txt' -> 'directory10/pic99.jpg'
mkdir: created directory 'directory11'
renamed '9.csv' -> 'directory11/pic100.jpg'
renamed '9.mp3' -> 'directory11/pic101.jpg'
renamed '9.pdf' -> 'directory11/pic102.jpg'
renamed '9.rpm' -> 'directory11/pic103.jpg'
renamed '9.txt' -> 'directory11/pic104.jpg'
检查其目录中的文件。
ls /tmp/testing/directory[0-9]*/
输出
/tmp/testing/directory1/:
pic0.jpg pic1.jpg pic2.jpg pic3.jpg pic4.jpg pic5.jpg pic6.jpg pic7.jpg pic8.jpg pic9.jpg
/tmp/testing/directory10/:
pic90.jpg pic91.jpg pic92.jpg pic93.jpg pic94.jpg pic95.jpg pic96.jpg pic97.jpg pic98.jpg pic99.jpg
/tmp/testing/directory11/:
pic100.jpg pic101.jpg pic102.jpg pic103.jpg pic104.jpg
/tmp/testing/directory2/:
pic10.jpg pic11.jpg pic12.jpg pic13.jpg pic14.jpg pic15.jpg pic16.jpg pic17.jpg pic18.jpg pic19.jpg
/tmp/testing/directory3/:
pic20.jpg pic21.jpg pic22.jpg pic23.jpg pic24.jpg pic25.jpg pic26.jpg pic27.jpg pic28.jpg pic29.jpg
/tmp/testing/directory4/:
pic30.jpg pic31.jpg pic32.jpg pic33.jpg pic34.jpg pic35.jpg pic36.jpg pic37.jpg pic38.jpg pic39.jpg
/tmp/testing/directory5/:
pic40.jpg pic41.jpg pic42.jpg pic43.jpg pic44.jpg pic45.jpg pic46.jpg pic47.jpg pic48.jpg pic49.jpg
/tmp/testing/directory6/:
pic50.jpg pic51.jpg pic52.jpg pic53.jpg pic54.jpg pic55.jpg pic56.jpg pic57.jpg pic58.jpg pic59.jpg
/tmp/testing/directory7/:
pic60.jpg pic61.jpg pic62.jpg pic63.jpg pic64.jpg pic65.jpg pic66.jpg pic67.jpg pic68.jpg pic69.jpg
/tmp/testing/directory8/:
pic70.jpg pic71.jpg pic72.jpg pic73.jpg pic74.jpg pic75.jpg pic76.jpg pic77.jpg pic78.jpg pic79.jpg
/tmp/testing/directory9/:
pic80.jpg pic81.jpg pic82.jpg pic83.jpg pic84.jpg pic85.jpg pic86.jpg pic87.jpg pic88.jpg pic89.jpg
,
我认为这就是您所需要的。
COUNT=0
find test -name "pic_*.jpg"|tr -s '_' '.'|awk -F'.' '{print $(NF-2),$(NF-1),$(NF)}'|sort -nk 2|awk '{print $1"_"$2"."$3}'|while read line;do
echo $line
COUNT=$((COUNT+1))
echo $COUNT
DIR=$(($COUNT / 10 + 1))
echo $DIR
mkdir -p dir$DIR
mv $line dir$DIR
done
取决于:
所有保存在test目录下并命名为pic_xxx.jpg的文件