根据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,因为这使用了。