根据bash中的编号将文件夹分隔为子文件夹
我有以下目录树:根据bash中的编号将文件夹分隔为子文件夹,bash,Bash,我有以下目录树: 1_loc 2_buzdfg 4_foodga 5_bardfg 6_loc 8_buzass 9_foossd 12_bardaf 文件夹排序中可能缺少编号 我想根据编号将这些文件夹分为子文件夹,以便在第二个_loc文件夹之前编号小于6的所有文件夹将转到folder1,编号等于或大于6的所有文件夹将转到folder2 当然,我可以用鼠标很容易地解决这个问题,但我想从终端上得到一个如何自动解决这个问题的建议 有什么想法吗?我认为解决办法是循环浏览文件,并在第一个之前检查数字
1_loc
2_buzdfg
4_foodga
5_bardfg
6_loc
8_buzass
9_foossd
12_bardaf
文件夹排序中可能缺少编号
我想根据编号将这些文件夹分为子文件夹,以便在第二个_loc文件夹之前编号小于6的所有文件夹将转到folder1,编号等于或大于6的所有文件夹将转到folder2
当然,我可以用鼠标很容易地解决这个问题,但我想从终端上得到一个如何自动解决这个问题的建议
有什么想法吗?我认为解决办法是循环浏览文件,并在第一个之前检查数字 首先,让我们检查一下如何在以下时间之前获取号码: 好的,这样就行了。然后,让我们循环:
for file in *
do
echo "$file"
(( ${file%%_*} > 5)) && echo "moving to dir2/" || echo "moving to dir1/"
done
我认为解决办法是循环浏览文件并在第一次检查之前检查编号 首先,让我们检查一下如何在以下时间之前获取号码: 好的,这样就行了。然后,让我们循环:
for file in *
do
echo "$file"
(( ${file%%_*} > 5)) && echo "moving to dir2/" || echo "moving to dir1/"
done
假设folder1和folder2存在于同一目录中,我将这样做:
for d in *_*; do # to avoid folder1 and folder2
# check if the first field seperated by _ is less than 5
if ((`echo $d | cut -d"_" -f1` < 6)); then
mv $d folder1/$d;
else
mv $d folder2/$d;
fi;
done
更多关于假设folder1和folder2存在于同一目录中,我将这样做:
for d in *_*; do # to avoid folder1 and folder2
# check if the first field seperated by _ is less than 5
if ((`echo $d | cut -d"_" -f1` < 6)); then
mv $d folder1/$d;
else
mv $d folder2/$d;
fi;
done
有关的详细信息您可以转到当前目录并运行以下简单命令:
mv {1,2,3,4}_* folder1/
mv {5,6,7,8}_* folder2/
这假定没有以这些前缀(即1-8)开头的其他文件/目录。您可以转到当前目录并运行以下简单命令:
mv {1,2,3,4}_* folder1/
mv {5,6,7,8}_* folder2/
这假设没有以这些前缀(即1-8)开头的其他文件/目录。另一个纯bash、参数扩展解决方案:-
#!/bin/bash
# 'find' returns folders having a '_' in their names, the flag -print0 option to
# preserve special characters in names.
# the folders are names as './1_folder', './2_folder', bash magic is done
# to remove those special characters.
# '-v' flag in 'mv' for verbose action
while IFS= read -r -d '' folder; do
folderName="${folder%_*}" # To strip the characters after the '_'
finalName="${folderName##*/}" # To strip the everything before '/'
((finalName > 5)) && mv -v "$folder" folder1 || mv -v "$folder" folder2
done < <(find . -maxdepth 1 -mindepth 1 -name "*_*" -type d -print0)
另一个纯bash的参数扩展解决方案:-
#!/bin/bash
# 'find' returns folders having a '_' in their names, the flag -print0 option to
# preserve special characters in names.
# the folders are names as './1_folder', './2_folder', bash magic is done
# to remove those special characters.
# '-v' flag in 'mv' for verbose action
while IFS= read -r -d '' folder; do
folderName="${folder%_*}" # To strip the characters after the '_'
finalName="${folderName##*/}" # To strip the everything before '/'
((finalName > 5)) && mv -v "$folder" folder1 || mv -v "$folder" folder2
done < <(find . -maxdepth 1 -mindepth 1 -name "*_*" -type d -print0)
您可以使用以下代码创建脚本,运行脚本时,文件夹将根据需要移动
#seperate the folders into 2 folders
#this is a generic solution for any folder that start with a number
#!/bin/bash
for file in *
do
prefix=`echo $file | awk 'BEGIN{FS="_"};{print $1}'`
if [[ $prefix != ?(-)+([0-9]) ]]
then continue
fi
if [ $prefix -le 4 ]
then mv "$file" folder1
elif [ $prefix -ge 5 ]
then mv "$file" folder2
fi
done
您可以使用以下代码创建脚本,运行脚本时,文件夹将根据需要移动
#seperate the folders into 2 folders
#this is a generic solution for any folder that start with a number
#!/bin/bash
for file in *
do
prefix=`echo $file | awk 'BEGIN{FS="_"};{print $1}'`
if [[ $prefix != ?(-)+([0-9]) ]]
then continue
fi
if [ $prefix -le 4 ]
then mv "$file" folder1
elif [ $prefix -ge 5 ]
then mv "$file" folder2
fi
done
为什么我不需要在${file%%\u*}>5之前使用$?或者,为什么我只需要在回显结果时使用$?@DanielG因为它使用了。为什么我不需要在${file%%\u*}>5之前使用$?或者,当我想要回显结果时,为什么只需要使用$?@DanielG,因为这使用了。