Переименовать файлы и каталоги (добавить префикс)

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
Mark

Ответы:

224

Благодаря Питеру ван дер Хейдену , вот тот, который будет работать для имен файлов с пробелами в них:

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

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

CanSpice
источник
Хех, правда, это совершенно не будет работать, если у вас есть файл с пробелом в нем.
CanSpice
12
Если вы измените lsкоманду на *и поставите двойные кавычки вокруг аргументов mv, она будет работать для файлов, содержащих пробелы.
Питер ван дер Хейден
@CanSpice Можно ли отменить эту операцию (удалить префикс) с помощью аналогичного сценария?
Паскаль Куй
3
Спасибо друг. Стажер здесь терял пальцы, переименовывая все 67 файлов. Приветствия.
Фелипе
1
Это должен быть "mv -", а не просто "mv", для защиты от файлов, начинающихся с тире, которые иначе интерпретировались бы как переключатели команд. Я внесу правку, чтобы исправить это.
Джейкоб С. говорит восстановить Монику
81

Используйте переименовать скрипт таким образом:

$ rename 's/^/PRE_/' *

Нет проблем с метасимволами или пробелами в именах файлов.

tchrist
источник
3
В некоторых системах есть утилита util-linux под названием «переименование», которая работает по-другому (в Ubuntu она называется «rename.ul»).
Приостановлено до дальнейшего уведомления.
renameвсегда помогал мне легко обрабатывать несколько переименований файлов.
Алан Хаггай Алави
61

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

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

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

Он использует параметр замены параметра xargs: -I. И вы можете получить более подробную информацию из справочной страницы.

Чжэн Цинь
источник
2
PS: Если вы просто хотите переименовать файлы деталей (каталоги) текущего каталога, просто отфильтруйте их перед xargs, например:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin
интересно использование переименования не сработало. использование xargs прошло хорошо для моей установки RHEL, так что +1 для этой опции облегчает понимание команды
Acewin
Не работает, если имя файла содержит одинарные кавычки, происходит сбой с: xargs: unmatched single quote; по умолчанию кавычки являются специальными для xargs, если вы не используете опцию -0
Евгений Веретенников
36

Это можно сделать с помощью простой findкоманды:

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

Приведенная выше команда префикс всех файлов и папок в текущем каталоге с PRE_.

Cyclonecode
источник
8

Чтобы добавить префикс ко всем файлам и папкам в текущем каталоге с помощью util-linux rename(в отличие prenameот варианта perl из Debian и некоторых других систем), вы можете сделать:

rename '' <prefix> *

Это находит первое вхождение пустой строки (которая обнаруживается немедленно), а затем заменяет это вхождение вашим префиксом, а затем склеивает оставшуюся часть имени файла до конца этого. Готово.

Для суффиксов вам нужно использовать версию perl или использовать find .

koyae
источник
util-linuxна Debian Stretch, кажется, обеспечивает это как /usr/bin/rename.ul.
user1338062
7

Если у вас есть Ruby (1.9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'
Каруми
источник
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
conradkleinespel
источник
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
SteinAir
источник