2013-01-13 12 views
12

Ich habe so etwas wie dies:auf den Namen des Verzeichnisses

v_1/file.txt 
v_2/file.txt 
v_3/file.txt 
... 

und ich mag diese Dateien so etwas benennen:

v_1.txt 
v_2.txt 
v_3.txt 
... 

im gleichen Verzeichnis .

Ich denke, ich kann rename verwenden, aber ich kann nicht herausfinden, wie man es mit der Umbenennung von Ordnern und Dateien gleichzeitig verwendet.

Antwort

19

Das Ergebnis kann mit einem bash for-Schleife und mv erreicht werden Räume. Verwandte link.

Eine andere Lösung basiert auf Kommentare (die auch für Verzeichnisse mit Leerzeichen im Namen funktioniert):

find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \; 
+0

scheint gut genug zu sein – giskou

+0

'$ subdir' sollte' "$ subdir" ' sein und die leeren Ordner ' finden. -type d-empty -exec rm -rf \ {\} \; ' – giskou

+0

@giskou Wenn Sie gerne tippen.Das Umbenennen einer einzelnen #/Datei ## 'ist viel einfacher zu schreiben und ist auf der richtigen Abstraktionsebene. Wenn du die gleiche Shell-Schleife wiederholst, wird dein ganzes Leben alt, um Dateien umzubenennen. – tchrist

1

Scheinen ziemlich einfach für mich:

for subdir in *; do mv $subdir/file.txt $subdir.txt; done; 

Beachten Sie, dass die Lösung oben nicht funktioniert, wenn der Verzeichnisname enthält:

$ mkdir /tmp/sandbox 
$ cd /tmp/sandbox 

$ mkdir v_{1,2,3} 
$ touch v_{1,2,3}/file.txt 

$ rename -v 's#/file##' v_{1,2,3}/file.txt 
rename v_1/file.txt v_1.txt 
rename v_2/file.txt v_2.txt 
rename v_3/file.txt v_3.txt 

$ ls -F 
v_1/ v_1.txt v_2/ v_2.txt v_3/ v_3.txt 
+2

die Unterordner sind etwa 130 und nicht nur 3: P – giskou

+0

@giskou Ich verstehe nicht, warum das so wichtig ist: Ich habe lediglich demonstrierte, dass die Technik funktioniert. Die Anzahl der Unterverzeichnisse ist unerheblich, es sei denn, Sie treffen 'xargs'-Grenzen, und selbst das ist trivial, da die' rename'-Datei die Dateinamen auf stdin liest. – tchrist

+0

Ich bin mehr zu bash als perl und regexps. Wenn Sie Ihre Technik im Detail erklären könnten ... Ich weiß wirklich nicht, was es tut: P – giskou

1

Sie rnm verwenden können. Der Befehl wäre:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory 

-fo impliziert Datei nur Modus.

-dp Verzeichnistiefe. -1 macht es rekursiv für alle Unterverzeichnisse.

-ns bedeutet Name Zeichenfolge, d. H. Der neue Name der Datei.

/pd0/ ist das unmittelbare übergeordnete Verzeichnis der Datei, die umbenannt werden muss.

-ss ist ein Suchstring (Regex). '\.txt$' Regex sucht nach Datei mit .txt am Ende des Dateinamens.

/path/to/the/directory Dies ist der Pfad, in dem sich die Verzeichnisse v_1, v_2 ... befinden. Sie können die Verzeichnisse (v_1, v_2 ...) auch an Stelle des übergeordneten Verzeichnispfads übergeben. Zum Beispiel:

#from inside the parent directory 
rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' v_*