linux中如何根据文件名创建多个目录并更改文件名?

linux中如何根据文件名创建多个目录并更改文件名?

我有一个目录AllData,其中包含一些文件,如下所示:

AllData
 |____ file_1to1000.track
 |____ file_1001to2000.track
 |____ file_2001to3000.track

根据文件名,我创建了带有文件名的目录。

for file in *; do dir=$(echo $file | cut -d. -f1); mkdir -p $dir; mv $file $dir; done

我想在其中创建另一个目录并保留文件。它应该像下面这样:

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ file_1to1000.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ file_1001to2000.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ file_2001to3000.track

将文件移动到上述目录后,文件名应从 更改file_1to1000.tracksoft.track.目录中的所有文件都需要从原始文件名更改为soft.track它基本上应该如下所示:

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ soft.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ soft.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ soft.track

答案1

查看:

for file in ./*; do
    echo mkdir -p "${file%.*}"/cuffcompare/ && \
    echo mv "$file" "$_"soft.track
done

至班轮:

for file in ./*; do echo mkdir -p "${file%.*}"/cuffcompare/ && echo mv "$file" "$_"soft.track; done

注意:echo当您对试运行结果感到满意时,请删除上面的内容。


${file%.*}从文件名中删除最短的匹配后缀。所以它.track从这里的文件名末尾开始剪切。已知的参数扩展

$_是前一个命令的最后一个参数的替代品(参见外壳特殊参数);扩展到"${file%.*}"/cuffcompare/;

因此为找到的每个文件mkdir创建下面的目录(-p如果不存在则用于创建父目录)结构;

└── file_2001to3000
    └── cuffcompare

然后mv将该文件移动并重命名到其相关目录,soft.tarck名称为:

└── file_2001to3000
    └── cuffcompare
        └── soft.track

相关内容