Bash:将多个文件移动到子文件夹中

Bash:将多个文件移动到子文件夹中,bash,find,move,Bash,Find,Move,我有一个包含数千个文件的文件夹,我想根据文件名中的字符串将它们移动到子文件夹中。这些文件都具有如下结构 something-run1_001.txt something-run22_1243.txt 因此,我尝试了以下脚本,以便将其中包含run1的所有文件移动到子文件夹r1中,并将所有run22文件移动到子文件夹r22中,以此类推,但这样做无效,我得到一条消息:文件X与文件X相同 #!bin/bash for i in {1..39} do foldername=r$i #echo "$fol

我有一个包含数千个文件的文件夹,我想根据文件名中的字符串将它们移动到子文件夹中。这些文件都具有如下结构

something-run1_001.txt

something-run22_1243.txt

因此,我尝试了以下脚本,以便将其中包含run1的所有文件移动到子文件夹r1中,并将所有run22文件移动到子文件夹r22中,以此类推,但这样做无效,我得到一条消息:文件X与文件X相同

#!bin/bash

for i in {1..39}
do
foldername=r$i
#echo "$foldername"
mkdir $foldername
find . -type f -name "*run$i_*" | xargs -i mv {} $foldername/ 
done

如何解决这个问题?

这项工作符合您的要求吗


mv*run*.html dir1

这项工作符合您的要求吗


mv*run*.html dir1

如果您仍然遇到太多参数的陷阱,您可以通过管道将其放入while循环中

#!/bin/bash -u
find . -maxdepth 1 -name '*-run*_*.txt' |
{
    while read FNAME
    do
        N=${FNAME##*-run}
        N=${N%_*}
        DIR=r$N
        test -d $DIR || mkdir $DIR
        mv $FNAME $DIR/.
    done
}

如果仍然遇到太多参数的陷阱,可以将find导入while循环

#!/bin/bash -u
find . -maxdepth 1 -name '*-run*_*.txt' |
{
    while read FNAME
    do
        N=${FNAME##*-run}
        N=${N%_*}
        DIR=r$N
        test -d $DIR || mkdir $DIR
        mv $FNAME $DIR/.
    done
}

很容易。。。我以前也尝试过类似但不一样的方法,结果陷入了太多争论的陷阱。太容易了。。。我以前尝试过类似但不相同的方法,但遇到了太多的参数陷阱。我认为我首先遇到它的原因是我没有将${I}与额外的{}一起使用。我已经对此进行了广泛的测试,阿塞里克的解决方案成功了。find是一个非常强大的东西,但是,我可能应该读一些关于它的文章……我认为我首先遇到它的原因是我没有将${I}与额外的{}一起使用。我已经对此进行了广泛的测试,阿塞里克的解决方案成功了。发现是一个非常强大的东西,但是,我应该读一点关于它。。。