重命名前缀为foldername的文件夹中的所有文件

时间:2016-06-14 06:23:26

标签: linux bash shell ubuntu terminal

我有一堆目录,每个目录都有多个文件。

dir1 
|- part1.txt 
|- part2.txt . . .

dir2 
|- part1.txt 
|- part2.txt . . .

我想将内部文件(part1.txt等)重命名为(dir1_part1.txt)。如何在ubuntu中完成?

This question解释了如何添加或删除后缀前缀。但是如何将前缀添加为目录名

3 个答案:

答案 0 :(得分:1)

好的,这是一个简单的例子。

$ mkdir dir{1..5}
$ touch dir{1..5}/part{1..5}.txt
# the command above create the files for testing
# then do the rename action
$ for f in dir*/*;do mv -v $f $(dirname $f)/$(dirname $f)_$(basename $f);done

答案 1 :(得分:1)

使用bashparameter-expansion的简单find脚本来查找目录名称。

#!/bin/bash

find . -name "*.csv" -type f -printf '%f\n' |
   while read -r x; do
       mv -v "$x" "${PWD##*/}_$x"
   done

处理具有特殊字符的文件: -

要处理包含换行符或其他类型的空格或其他特殊字符的文件名,请使用-print0中的find并使用限制器''阅读它们: -

再次使用参数扩展,从查找命令中删除前导字符./

#!/bin/bash

find . -name "*.csv" -type f -print0 |
   while IFS= read -r -d '' x; do
       x="${x:2}"
       mv -v "$x" "${PWD##*/}_$x"
   done

一个工作示例: -

[dude@csv_folder]$ ls *.csv
1.csv  2.csv  3.csv  4.csv

[dude@csv_folder]$ ./myScript.sh
`1.csv' -> `csv_folder_1.txt'
`2.csv' -> `csv_folder_2.txt'
`3.csv' -> `csv_folder_3.txt'
`4.csv' -> `csv_folder_4.txt'

答案 2 :(得分:1)

有一个名为perl-rename的工具,有时称为rename,不要与rename from util-linux混淆。此工具采用perl表达式并重新命名:

perl-rename 's~/~_~' dir1/* dir2/*

以上内容会重命名并将dir1dir2中的所有文件移至以下位置:

dir1/file1 -> dir1_file1
dir1/file2 -> dir1_file2
dir1/file3 -> dir1_file3

You can play with the regex online