2016-06-14 145 views
0

前綴我有一堆目錄,每個都具有多個文件的文件夾中的所有文件。重命名文件夾名與

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

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

我想內部文件(part1.txt等)重命名爲類似(dir1_part1.txt)。這怎麼能在Ubuntu下完成?

This question解釋後綴前綴如何可以添加或刪除。但是,如何添加前綴作爲目錄名稱

+0

我如何得到一個目錄列表作爲前綴? –

+1

你真的花時間學習基本的shell腳本嗎?如果是這樣,請顯示您的嘗試腳本。有很多不同的方法來獲取目錄名,最好的方法可能取決於你如何編寫腳本的其餘部分。 – kaylum

+0

['重命名-v的|([^ /] *)/([^ /] *)$ | $ $ 1_ 2 |' */*'](http://www.unix.com/man-page/linux/1/rename/) – anishsane

回答

1

有一個叫perl-rename工具,有時也被稱爲rename,不要與rename from util-linux混淆。該工具需要一個Perl的表達和accordently重命名:

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

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 
+0

EEEE ... [不解析ls或find(HTTP://mywiki.wooledge。 org/ParsingLs)至少沒有使用for循環。 – anishsane

+0

確定,更改爲通配符 – alijandro

+1

請註明參數擴展 – andlrc

1

使用findparameter-expansion查找的目錄名稱的簡單bash腳本。

#!/bin/bash 

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

要使用特殊字符處理文件: -

處理包含換行符或其他類型的空格或其他特殊字符的文件名,我採用-print0find和一個讀取它們解除限制器'': -

我再次使用參數擴展,從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 

工作的示例: -

[[email protected]_folder]$ ls *.csv 
1.csv 2.csv 3.csv 4.csv 

[[email protected]_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'