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,


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)


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


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.


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_.


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 .


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) }'


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: $!";
}

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.