Zmień nazwy plików i katalogów (dodaj przedrostek)

137

Chciałbym dodać prefiks do wszystkich folderów i katalogów.

Przykład:

mam

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Chciałbym dodać przedrostek „PRE_”

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

Pozdrowienia,

Rafael
źródło
Użyj AWK jak w tej odpowiedzi: awk '$ 0 = "prefiks" $ 0' file> new_file
Oznacz

Odpowiedzi:

224

Dzięki Peterowi van der Heijdenowi , oto jeden, który będzie działał dla nazw plików ze spacjami:

for f in * ; do mv -- "$f" "PRE_$f" ; done

(„-” jest potrzebne, aby odnieść sukces w przypadku plików zaczynających się od myślników, których nazwy w innym przypadku byłyby interpretowane jako przełączniki polecenia mv)

CanSpice
źródło
Heh, prawda, to całkowicie nie zadziała, jeśli masz plik ze spacją.
CanSpice
12
Jeśli zmienisz lspolecenie na *i umieścisz podwójne cudzysłowy wokół argumentów na mv, zadziała to dla plików zawierających spacje.
Peter van der Heijden
@CanSpice Czy można odwrócić tę operację (usunąć prefiks) za pomocą podobnego skryptu?
Pascal Qyy,
3
Dzięki stary. Stażysta stracił czapki na palce, zmieniając nazwy wszystkich 67 plików. Twoje zdrowie.
Felipe
1
Powinno to być „mv -”, a nie tylko „mv”, aby chronić przed plikami zaczynającymi się od myślników, które w przeciwnym razie byłyby interpretowane jako przełączniki poleceń. Napiszę poprawkę, aby to poprawić.
Jacob C. mówi Reinstate Monica
81

Użyj the przemianować skrypt w ten sposób:

$ rename 's/^/PRE_/' *

Nie ma problemów z metaznakami lub białymi znakami w nazwach plików.

tchrist
źródło
3
Niektóre systemy mają narzędzie util-linux o nazwie „rename”, które działa inaczej (w Ubuntu nazywa się to „rename.ul”).
Wstrzymano do odwołania.
renamezawsze pomagał mi bardzo łatwo obsługiwać wiele zmian nazw plików.
Alan Haggai Alavi,
61

Aby dodać przedrostek lub sufiks do plików (katalogów), możesz użyć prostego i wydajnego sposobu przez xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Używa opcji zastępującej paramerter w xargs: -I. Więcej szczegółów znajdziesz na stronie man.

Zheng Qsin
źródło
2
PS: Jeśli chcesz tylko zmienić nazwy plików części (katalogów) bieżącego katalogu, po prostu przefiltruj je przed xargs, na przykład:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin
co ciekawe, zmiana nazwy nie zadziałała. użycie xargs poszło dobrze dla mojej konfiguracji RHEL, więc +1 dla tej opcji ułatwia zrozumienie polecenia
Acewin
Nie działa, jeśli nazwa pliku zawiera pojedynczy cudzysłów, kończy się niepowodzeniem z: xargs: niedopasowany pojedynczy cudzysłów; domyślnie cytaty są specjalne dla xargs, chyba że użyjesz opcji -0
Evgeny Veretennikov
36

Można to zrobić, uruchamiając proste findpolecenie:

find * -maxdepth 0 -exec mv {} PRE_{} \;

Powyższe polecenie spowoduje przedrostek wszystkich plików i folderów w bieżącym katalogu PRE_.

Cyclonecode
źródło
8

Aby dodać prefiks do wszystkich plików i folderów w bieżącym katalogu za pomocą narzędzia util-linux rename(w przeciwieństwie do prenamewariantu perl z Debiana i niektórych innych systemów), możesz wykonać:

rename '' <prefix> *

Znajduje to pierwsze wystąpienie pustego ciągu (który znajduje się natychmiast), a następnie zastępuje to wystąpienie twoim przedrostkiem, a następnie przykleja resztę nazwy pliku do końca tego. Gotowe.

W przypadku przyrostków musisz użyć wersji Perla lub użyć funkcji find .

koyae
źródło
util-linuxw Debian Stretch wydaje się udostępniać to jako plik /usr/bin/rename.ul.
user1338062
7

Jeśli masz Rubiego (1,9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'
kurumi
źródło
7

z Perlem:

perl -e 'rename $_, "PRE_$_" for <*>'
tadmc
źródło
2

Oto prosty skrypt, którego możesz użyć. Lubię używać niestandardowego modułu File::chdirdo obsługi cdoperacji zarządzania , więc aby używać tego skryptu bez zmian, będziesz musiał go zainstalować ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}
Joel Berger
źródło
1

W moim systemie nie mam renamepolecenia. Oto prosta jedna wkładka. Znajduje rekursywnie wszystkie pliki HTML i dodaje prefix_przed ich nazwami:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
conradkleinespel
źródło
1
z findtobą możesz również wykonywać polecenia, bez pętli: stackoverflow.com/a/33297439/2351568
DJCrashdummy
0

Spowoduje to przedrostek plików w ich katalogu.

To ${f%/*}ścieżka do ostatniego ukośnika /-> katalog

To ${f##*/}jest tekst bez niczego przed ostatnim ukośnikiem /-> nazwa pliku bez ścieżki

A więc tak to wygląda:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
SteinAir
źródło