Перейменуйте всі файли в папці з префіксом "Unix_"
Припустимо, у папці є два файли
a.txt
b.pdf
тоді їх обох слід перейменувати з однієї команди на
Unix_a.txt
Unix_b.pdf
Перейменуйте всі файли в папці з префіксом "Unix_"
Припустимо, у папці є два файли
a.txt
b.pdf
тоді їх обох слід перейменувати з однієї команди на
Unix_a.txt
Unix_b.pdf
Відповіді:
Якщо ваші імена файлів не містять пробілів і у вас немає підкаталогів, ви можете використовувати простий for
цикл:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
В іншому випадку скористайтеся зручною rename
командою (яка є скриптом perl) - хоча вона може бути доступна не з коробки на кожному Unix (наприклад, OS X не постачається rename
).
Короткий огляд на debian-administration.org:
Якщо ваші імена файлів містять пробіли, їх легше використовувати find
, в Linux має працювати наступне:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
У системах BSD -printf
варіант, на жаль, відсутній . Але GNU findutils має бути встановленим (наприклад, на Mac OS X з brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
би ловити лише файли (без підкаталогів, посилань тощо) ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
працює правильно, незалежно від того, які символи містяться в іменах файлів. Він також переміщує каталоги, сокети, символьні посилання та інші типи файлів; Я припускаю, що це не має значення.
.
перед усіма моїми файлами
Спробуйте rename
команду в папці з файлами :
rename 's/^/Unix_/' *
Аргумент rename ( команда s s ) вказує на заміну регулярного виразу ^ на Unix_ . Каретка (^) - це спеціальний символ, що означає початок рядка .
's/^/.../'
означає?
's/^/.../'
- аргумент виразу perl для команди перейменування
rename 's/^start_/run_' *
Я думаю, це саме те, що ви шукаєте:
ls | xargs -I {} mv {} Unix_{}
Так, він простий, але елегантний та потужний, а також однокласний. Ви можете отримати більш детальне вступне повідомлення від мене на сторінці: Перейменувати файли та каталоги (Додати префікс)
ls
- це може призвести до проблем, якщо в іменах файлів є пробіли або інші дивні символи.
Нещодавно я зіткнувся з цією ж ситуацією і знайшов простіше вбудоване рішення. Я ділюсь ним тут, щоб це могло допомогти іншим людям, які шукають рішення.
З OS X Yosemite Apple інтегрувала можливості пакетного перейменування безпосередньо у Finder. Детальна інформація доступна тут . Я також скопіював наведені нижче кроки,
Перейменуйте кілька елементів
Виділіть елементи, потім клацніть один із них, утримуючи клавішу Control.
У контекстному меню виберіть Перейменувати елементи.
У спливаючому меню під пунктом Перейменувати елементи папки виберіть замінити текст в іменах, додати текст до імен або змінити формат імен.
Замінити текст: введіть текст, який потрібно видалити, у поле Знайти, а потім введіть текст, який потрібно додати, у поле “Замінити на”.
Додати текст: введіть текст, який потрібно додати в поле, а потім виберіть, щоб додати текст до або після поточної назви.
Формат: Виберіть формат імені для файлів, а потім поставте індекс, лічильник або дату до або після імені. Введіть ім’я в поле Спеціальний формат, а потім введіть номер, з якого потрібно розпочати.
Клацніть Перейменувати.
Якщо у ваших файлах є загальний шаблон, тоді ви можете використовувати Замінити текст, інакше додавання тексту також допоможе.
Ви можете просто використовувати -i
замість-I {}
ls | xargs -i mv {} unix_{}
Це також чудово працює.
ls
- перераховує всі файли в каталозіxargs
- приймає всі файли рядок за рядком завдяки -i
можливості{}
- заповнювач для всіх файлів, необхідний, якщо xargs
отримує більше двох аргументів як вхідні даніВикористання awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
застаріло, зараз просто-I
Також працює для елементів з пробілами та ігнорує каталоги
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
З rnm (вам потрібно буде встановити його):
rnm -ns 'Unix_/fn/' *
Або
rnm -rs '/^/Unix_/' *
PS: Я автор цього інструменту.
rename
у мене це не працює, але rnm
працює.
Ситуація:
У нас certificate.key
certificate.crt
всередині/user/ssl/
Ми хочемо перейменувати все, що починається з certificate
наcertificate_OLD
Зараз ми знаходимося всередині /user
Спочатку ви робите сухий пробіг з -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Що повертає:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
Ваші файли залишаться незмінними, це лише тестовий запуск.
Рішення:
Коли ви задоволені результатом тесту, запустіть його по-справжньому:
rename "s/certificate/certificate_OLD/" ./ssl/*
Що це означає:
`перейменувати" ШЛЯХ / НЕЩЕ / НЕЩЕ_ЕЩЕ "ШЛЯХ / ФАЙЛИ
Порада:
Якщо ви вже на шляху, запустіть його так:
rename "s/certificate/certificate_OLD/" *
Або якщо ви хочете зробити це в будь-якому підкаталозі, починаючи з ss
do:
rename -n "s/certificat/certificate_old/" ./ss*/*
Ви також можете зробити:
rename -n "s/certi*/certificate_old/" ./ss*/*
Яка перейменовує будь-що, починаючи з certi
будь-якого підкаталогу, починаючи з ss
.
Небо - межа.
Пограйте з регулярним виразом і ЗАВЖДИ перевіряйте це ПЕРЕД тим, як -n
.
ПЕРЕГЛЯНУЙТЕ ЦЕ, ЩОБ НАВІТЬ ПЕРЕМЕНИТИ ПАПКУ НАЗВИ, ЩО ЗБІГАЮТЬСЯ. Краще cd
в каталог і зробіть це там. ВИКОРИСТАННЯ НА ВЛАСНИЙ РИЗИК.
find -execdir rename
Це перейменовує файли та каталоги з регулярним виразом, що впливає лише на базові імена.
Отже, для префікса ви можете зробити:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
або впливати лише на файли:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
спочатку cd
s в каталог, перш ніж виконувати лише базове ім'я.
Я пояснив це більш докладно в: Знайдіть кілька файлів і перейменуйте їх у Linux