我有许多文件试图从主目录移动到内部有多个子目录的单独目录。
示例文件命名约定 1SA_1BA_1W.out、2SA_3BA_3W.out、4SA_2BA_5W.out...有没有一种方法给出每个 SA、BA、W 或其他项目的编号,我必须一次将所有项目移动到给定位置。 SA 的范围是 1-10,BA 1-4 等...目前我正在使用脚本命令,例如......
find . -type f -name '1A_1HNO3_W.out' | xargs -I {} cp '{}' /location/A_HNO3
find . -type f -name '2SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '3SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '4SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W
find . -type f -name '1SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '2SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '3SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
find . -type f -name '4SA_DEA_*W.out' | xargs -I {} cp '{}' /location/SA_DEA_W
有超过 1700 个带有各种标识缩写的文件,例如 SA BA A HNO3 W MA EAM TMA DMA DEA 等...我需要能够提取这些文件并将它们传输到一个简单的数据库结构中。 “位置”将是主父目录的名称,而 SA_DEA_W 等文件夹是父目录内的子目录。
答案1
mv *SA_BA_W.out /location/SA_BA_W;
mv *SA_DEA_W.out /location/SA_DEA_W
等等。
答案2
您可以使用以下命令一次性创建目录:
创建子目录
ls *.out | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk ' { system("mkdir -p /location/" $0) }'
或者
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk '{ system("mkdir -p /location/" $0) }'
或者
find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | xargs -I {} mkdir -p /location/{}
您可以使用下面的 for 循环执行这两种操作
创建子目录并将文件移动到相应目录:
for i in $(ls *.out)
do
DIR_NAME=$(echo $i | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g')
test -d /location/$DIR_NAME || mkdir /location/$DIR_NAME
mv $i $DIR_NAME
done
答案3
你可以尝试
find . -iname "*.out" -exec sh -c '
f=${1##*/};
f=${f%.out};
d=./location/$f/;
[ ! -d $f ] && mkdir -p $d;
mv $1 $d' sh {} \;
前提是你的文件路径中没有空格
演练
查找您的所有.out
文件,并针对每个文件-exec .... \;
find . -iname "*.out" -exec sh -c '...script...` sh {} \;
构造
sh -c `...script......` sh {}
将每个文件名作为{}
并将其传递回脚本中,就像$1
我们在其中一样
删除最后的目录路径/
并存储为f
f=${1##*/};
去掉.out
后缀
f=${f%.out};
计算你想要的目录并将其存储为d
d=./location/$f/;
如果该目录不存在,则创建该目录以及任何父目录-p
[ ! -d $d ] && mkdir -p $d;
行动起来
mv $1 $d' sh {} \;