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


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.