Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux命令行上将文件移动到匹配的文件夹_Linux_Bash_Shell_Cp_Mv - Fatal编程技术网

在linux命令行上将文件移动到匹配的文件夹

在linux命令行上将文件移动到匹配的文件夹,linux,bash,shell,cp,mv,Linux,Bash,Shell,Cp,Mv,我想将文件复制或移动到匹配的文件夹中。 以下是我的文件名: 1-filename-aa.txt 2-filename-aa.txt 3-filename-aa.txt 1-filename-bb.txt 2-filename-bb.txt 3-filename-bb.txt 以下是我的文件夹名称: aa_fa bb_fb 我尝试了使用“cp”命令的静态示例,但我有40个这样的文件夹: cp *aa.* aa_*/ cp *bb.* bb_*/ 我需要一个循环(可能是一行代码)来将这些文件复

我想将文件复制或移动到匹配的文件夹中。 以下是我的文件名:

1-filename-aa.txt
2-filename-aa.txt
3-filename-aa.txt
1-filename-bb.txt
2-filename-bb.txt
3-filename-bb.txt
以下是我的文件夹名称:

aa_fa
bb_fb
我尝试了使用“cp”命令的静态示例,但我有40个这样的文件夹:

cp *aa.* aa_*/
cp *bb.* bb_*/

我需要一个循环(可能是一行代码)来将这些文件复制或移动到匹配的文件夹。

为了安全起见,我会在目标目录后添加
/
,这样文件就不会被重命名,如果目录不存在,可能以后会被删除。谢谢反馈。此代码看起来很棒,但我有一个问题。“文件名”和文件扩展名部分不相同。这些部分在所有文件中都是唯一的,比如“083833 aa.png”“673839393 aa.rtf”可能在sed命令中使用
[a-zA-Z]*
而不是
txt
?@cnknv I更新了答案。您也可以使用[a-zA-Z]而不是前面提到的[^.]。
#for every file with extension
for file in *.*
do
    #extract catalog name
    ending=$(sed 's/.*-\(.*\)\.[^.]\+$/\1/g' <<< "$file")
    cp "$file" "${ending}_f${ending::1}"/
done
#for every file with extension

for file in *.*
do
    #extract catalog name
    ending=$(sed 's/.*-\(.*\)\.[^.]\+$/\1/g' <<< "$file")
    cp "$file" ${ending}_*/
done
[ -d "$file" ] && continue