Перейменування файлів і каталогів (Додати префікс)


137

Я хотів би додати префікс у всі папки та каталоги.

Приклад:

У мене є

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

Я хотів би додати префікс "PRE_"

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

З повагою,


Використовуйте AWK як у цій відповіді: awk '$ 0 = "префікс" $ 0' файл> new_file
— Позначити

Відповіді:


224

Завдяки Пітеру ван дер Хайден , ось який буде працювати для назви файлів з пробілами в них:

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

("-" потрібен для досягнення успіху у файлах, що починаються з тире, імена яких інакше трактуються як перемикачі команди mv)


Так, правда, це зовсім не спрацює, якщо у вас є файл із пробілом.
— CanSpice

12
Якщо ви зміните lsкоманду на *і покладете подвійні лапки навколо аргументів mv, вона буде працювати для файлів, що містять пробіли.
— Пітер ван дер Хайден

@CanSpice Чи можна змінити цю операцію (видалити префікс) аналогічним сценарієм?
— Паскаль Qyy

3
Дякую, друже. Стажист тут втрачав пальці, перейменувавши всі 67 файлів. Ура.
— Феліпе

1
Це повинно бути "mv -" не просто "mv", щоб захистити від файлів, що починаються з тире, що в іншому випадку трактується як перемикачі команд. Я вкладу правки, щоб виправити це.
— Якоб К. каже, що повернемо Моніку

81

Використовуйте перейменувати скрипт таким чином:

$ rename 's/^/PRE_/' *

Немає проблем з метахарактерами або пробілами у файлах файлів.


3
Деякі системи мають утиліту util-linux під назвою "перейменувати", яка працює інакше (в Ubuntu це називається "перейменувати.ul").
— Призупинено до подальшого повідомлення.

renameзавжди допомагав мені дуже легко впоратись із кількома перейменами файлів.
— Алан Хаггай Алаві

61

Для додавання префікса чи суфікса для файлів (каталогів) ви можете використовувати простий та потужний спосіб за допомогою xargs :

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

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

Він використовує параметр, що замінює параметр xargs: -I. А ви можете отримати більш детальну інформацію зі сторінки man.


2
PS: Якщо ви просто хочете перейменувати файли частин (каталогів) поточного каталогу, просто відфільтруйте його перед xargs, наприклад:ls *.old | xargs -I {} mv {} PRE_{}
— Zheng Qsin

що цікаво з використанням перейменування не вийшло. використання xargs вдалося для моєї настройки RHEL, тому +1 для цього параметра полегшує розуміння команди
— Acewin

Не працює, якщо ім'я файлу містить одну цитату, не вдається: xargs: неперевершена одна цитата; За замовчуванням котирування є спеціальними для xargs, якщо ви не використовуєте опцію -0
— Євгеній Веретенников

36

Це можна зробити за допомогою простої findкоманди:

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

Вищевказана команда буде префіксувати всі файли та папки в поточному каталозі PRE_.


8

Щоб додати префікс до всіх файлів і папок у поточному каталозі за допомогою util-linux's rename(на відміну prenameвід варіанту perl від Debian та деяких інших систем), ви можете зробити:

rename '' <prefix> *

Це знаходить перше виникнення порожнього рядка (який знайдено негайно), а потім замінює це явище вашим префіксом, а потім склеює решту імені файлу до кінця цього. Зроблено.

Для суфіксів потрібно використовувати версію perl або використовувати find .


util-linuxна Debian Stretch, здається, це дає /usr/bin/rename.ul.
— user1338062



2

Ось простий скрипт, який ви можете використовувати. Мені подобається використовувати нестандартний модуль File::chdirдля управління cdопераціями управління , тому для використання цього скрипту як -потрібно буде його встановити ( 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

У моїй системі я не маю renameкоманди. Ось простий один вкладиш. Він знаходить всі HTML-файли рекурсивно та додає prefix_перед їх іменами:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
з findви можете також виконувати команди, немає необхідності в циклі: stackoverflow.com/a/33297439/2351568
— DJCrashdummy

0

Це дозволить префіксувати ваші файли в їх каталозі.

Це ${f%/*}шлях до останнього косого /-> каталогу

Це ${f##*/}текст без нічого перед останньою косою /-> ім'ям файлу без шляху

Ось так і йде:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.