批量重命名基于目录名称的文件

时间:2016-10-11 17:06:52

标签: linux

我有相对大量的文件组织如下:

Control/Subject1/extra/filename.bvec
Control/Subject2/extra/filename.bvec
Control/Subject3/extra/filename.bvec

我正在尝试重命名filename.bvecs,以便他们的主题ID前缀为.bvec文件名(Subject1_filename.bvec等等。)

我知道我可以使用filename.bvec所在的目录使用下面的代码,但我似乎无法操纵它来使用主题ID。

for extra in *; do mv $extra/filename.bvec $extra_filename.txt; done;

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

准备模拟:

$ for i in `seq 1 3`; do mkdir -p Control/Subject${i}/extra/; touch Control/Subject${i}/extra/filename.bvec; done
$ tree
.
└── Control
    ├── Subject1
    │   └── extra
    │       └── filename.bvec
    ├── Subject2
    │   └── extra
    │       └── filename.bvec
    └── Subject3
        └── extra
            └── filename.bvec

7 directories, 3 files

做好工作:

$ for i in `find . -type f`; do nn=`sed 's,.*/\([^/]\+\)/extra/.*,\1,' <<<$i`; echo "$i -> $nn"; mv $i `dirname $i`/${nn}`basename $i`; done
./Control/Subject3/extra/filename.bvec -> Subject3
./Control/Subject2/extra/filename.bvec -> Subject2
./Control/Subject1/extra/filename.bvec -> Subject1

检查结果:

$ tree
.
└── Control
    ├── Subject1
    │   └── extra
    │       └── Subject1filename.bvec
    ├── Subject2
    │   └── extra
    │       └── Subject2filename.bvec
    └── Subject3
        └── extra
            └── Subject3filename.bvec

7 directories, 3 files

这就是你想要的吗?

答案 1 :(得分:1)

使用和递归,可重复使用的方式:

$ shopt -s globstar # enable recursion with **
$ rename -n 's!Control/(Subject\d+)/extra/filename\.bvec!Control/$1/extra/${1}_filename.bvec!' **

输出:

Control/Subject1/extra/filename.bvec -> Control/Subject1/extra/Subject1_filename.bvec
Control/Subject2/extra/filename.bvec -> Control/Subject2/extra/Subject2_filename.bvec
Control/Subject3/extra/filename.bvec -> Control/Subject3/extra/Subject3_filename.bvec

注意

(当你的测试没问题时删除-n开关)

warning http://pix.toile-libre.org/upload/original/1377510865.png 还有其他同名工具可能会或可能不会这样做,所以要小心。

如果您运行以下命令(GNU

$ file "$(readlink -f "$(type -p rename)")"

你有一个像

的结果
.../rename: Perl script, ASCII text executable

且不包含:

ELF

然后这似乎是正确的工具=)

如果没有,请将其设为Debian上的默认值(通常已经是这种情况)和Ubuntu之类的衍生物:

$ sudo update-alternatives --set rename /path/to/rename

(将/path/to/rename替换为perl's rename命令的路径。

如果您没有此命令,请搜索软件包管理器进行安装或do it manually

最后但并非最不重要的是,这个工具最初是由Perl的父亲Larry Wall编写的。