Bash-скрипт для исправления имен файлов

Это условия/действия языка find, из которых в основном состоит «выражение», на которое ссылается строка использования: -name, -type, -print, -exec и т. д. Этот термин используется для отделения их от операторов, которые объединяют только праймериз: ! , -a, -o и скобки.

Я не помню, чтобы этот термин использовался в других контекстах, кроме find. Он используется в спецификации POSIX для find и на справочной странице FreeBSD. GNU выделяется и в этом: документация по поиску GNU (например, справочная страница) не использует этот термин, а вместо этого разделяет первичные тесты на тесты о свойствах файлы, действия, которые что-то делают, и параметры, влияющие на работу find. Деление кажется полезным, но немного неточным, так как все основные цвета возвращают истинное значение, даже действия.

1
20.05.2016, 22:02
4 ответа

Вот код (замените каталог основным каталогом или местом, где у вас есть подкаталоги):

cd directory
find -type f | while IFS= read - file; do 
    name=$(echo "$file"  | rev | cut -d'/' -f1 | rev |  cut -d'-' -f3- | cut -d' ' -f2-) 
    path=$(dirname "$file")  
    newname="${path}/${name}"
    echo mv "$file" "$newname" 
done

Где каталог - это основной каталог, в котором находятся все подкаталоги ....

Пожалуйста, не удаляйте "echo" из "mv", сначала проверьте его.

Будьте осторожны, не запускайте это в неправильном каталоге, это может быть очень опасно.

0
28.01.2020, 01:17

Самым простым инструментом здесь будет zsh (как bash, только лучше), с его причудливым globbing и zmv функцией. Запустите ее из каталога верхнего уровня, в котором вы хотите переименовать файлы.

autoload -U zmv
zmv '(**/)[Ss][Ff][0-9]##-[0-9]##[- ]#(*)' '$1$2'

Объяснение: **/ - это любая строка ведущих каталогов. Затем идет шаблон sf (без учета регистра), за которым следует одна или несколько цифр, тире и еще одна цифра, за которой следуют тире и пробелы. Наконец, может быть любой суффикс *. Цифры в замене относятся к группам в скобках в шаблоне.


В качестве альтернативы вы можете использовать prename (скрипт переименования на основе Perl, доступный в Debian и Arch Linux, в других дистрибутивах может потребоваться отдельная установка). Вам нужно будет объединить его с find, чтобы собрать список файлов для переименования. Не имеет значения, если rename переданы несовпадающие файлы, он пропустит файлы, для которых переименование не требуется.

find -name '[Ss][Ff]*' -exec prename 's!/!sf[0-9]+-[0-9]+[- ]*!!i' {} +
0
28.01.2020, 01:17

Вы говорите, что вам нужно удалить все до {text} , но ваш пример этого не показывает. Вместо того, чтобы показывать точный код, позвольте мне предложить план.

1) Напишите сценарий, который сделает то, что вы хотите для одного имени файла. Что-то вроде этого может сделать:

#! /bin/sh
test -d ~/OK/${PWD} || mkdir -p ~/OK/${PWD}
ln "$1" "~/OK/${PWD}/$1"
echo "$1" | awk -F ' - ' '{print $NF}'

Это разбивает имя в шаблоне '-' и печатает последнее поле. И сохраняет исходное имя файла, чтобы вы могли восстановить его, если что-то пойдет не так. Протестируйте его несколько раз и используйте mv для восстановления имен.

2) Вызовите свой скрипт с помощью find :

$ find dirname -exec script.awk {} +

Это закроет вашу машину множеством параллельных вызовов вашего скрипта. Когда это будет сделано, вам нужно будет удалить несколько каталогов OK, и вы будете знать, как использовать find для их удаления.

0
28.01.2020, 01:17

Если у вас есть основанная на Perl утилита rename (в некоторых дистрибутивах она называется prename ), вы можете использовать Регулярное выражение для переименования всех файлов за один раз.

Ваше требование требует удаления sf {number} - {number} , но все примеры начинаются с заглавных букв, некоторые из них содержат только один {number} , ] {число} - {число} - {число} или даже {число} {пробел} - {пробел} {число} . Я предполагаю, что вы хотите включить первые два из этих случаев.

rename -n 's/^sf[0-9-]+\s+(-\s+)?//' [Ss][Ff]*

Удалите -n , когда вы будете готовы применить свои изменения, или измените его на -v , чтобы увидеть, как он обрабатывает файлы в процессе работы.

1
28.01.2020, 01:17

Теги

Похожие вопросы