Как вы переносите части имени файла в Linux?

Попробуйте установить опцию -o для remount для смены флагов.

mount -t tmpfs -o remount,rw,nosuid,nodev tmpfs /dev/shm

Подробнее читайте в разделе «ВАРИАНТЫ НЕЗАВИСИМОГО МОНТАЖА ФАЙЛОВОЙ СИСТЕМЫ».

http://manpages.ubuntu.com/manpages/precise/en/man8/mount.8.html

0
06.02.2017, 03:38
4 ответа

bashy ответ, специфичный для шаблона имени "xxx - yyyy.ddd" ..

find -type f | while read flnm ; do basename "$flnm" | awk -F'[\ .]' '{print $3 " " $2 " " $1 "."$4}'; done

Найдите файл и передайте имя циклу чтения while. Там используйте basename, чтобы извлечь имя и передать его Awk. Awk, используя несколько разделителей полей, пробел и точку, затем повторно печатает поля в желаемом порядке.

abcdef - ghijkl.pdf

становится

ghijkl - abcdef.pdf

практическим приложением ... переименовывать файлы в это новое имя шаблона

find -type f | while read flnm ; do mv "$(basename "$flnm")"  "$(basename "$flnm" | awk -F'[\ .]' '{print $3 " " $2 " " $1 "."$4}')"; done

Единственное различие - включение команды mv и перенос имен в виде строк.

0
28.01.2020, 02:13

Использование bash:

[[ $f =~ ^([^-]+)\ -\ ([^\.]+)\.(.*) ]] && 
  mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}.${BASH_REMATCH[3]}"

Здесь используется оператор проверки регулярного выражения bash = ~ , чтобы проверить, соответствует ли данное имя файла (в $ f ) шаблону: «все, кроме тире, за которым следует пробел, тире, пробел, за которым следует что угодно, кроме точки, за которой следует точка, за которой следует что-нибудь или ничего ". Если имя файла соответствует этому шаблону, совпадающие биты заключенных в скобки подразделов регулярного выражения назначаются элементам массива BASH_REMATCH.

Чтобы сделать это для каждого файла в определенной папке:

cd /to/that/folder
for f in *
do
  [ -f "$f" ] || continue
  [[ $f =~ ^([^-]+)\ -\ ([^\.]+)\.(.*) ]] && 
    mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}.${BASH_REMATCH[3]}"
done

Использование только расширений переменных, указанных в POSIX :

pre=${f%%.*}
ext=${f##*.}
mv "$f" "${pre##*- } - ${pre%% -*}.$ext"
4
28.01.2020, 02:13

Поскольку вы используете Ubuntu, у вас должен быть хотя бы один из perl rename или prename

$ rename -n -- 's/(\w*) - (\w*)/$2 - $1/' *.pdf
rename(abcdef - ghijkl.pdf, ghijkl - abcdef.pdf)

$ prename -n -- 's/(\w*) - (\w*)/$2 - $1/' *.pdf
abcdef - ghijkl.pdf renamed as ghijkl - abcdef.pdf

. В качестве альтернативы вы можете установить и использовать mmv

$ mmv -n '* - *.pdf' '#2 - #1.pdf'
abcdef - ghijkl.pdf -> ghijkl - abcdef.pdf

(во всех случаях удалите -n для фактического завершения операции).

4
28.01.2020, 02:13

Вы можете создать сценарий с помощью этой команды:

\ls *-*.pdf | sed 's/\(.*\)-\(.*\).pdf/mv \1-\2.pdf \2-\1.pdf/' > script_mv.bash

Затем вы проверяете правильность сценария и можете его выполнить:

. ./script_mv.bash

Я написал \ ls, потому что он отменяет параметры в ls.

Шаблон sed означает:

  • найти что-нибудь1, "-", что-нибудь2, ".pdf".
  • Оба элемента заключены в (), поэтому они получают имена \ 1 и \ 2.
  • затем я копирую строку mv, для этого я могу воссоздать имена файлов благодаря \ 1 и \ 2.
0
28.01.2020, 02:13

Теги

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