author - name
我想将某些书籍文件名中的字符串更改为name - author
.我想
ls * | sed -r 's/(.+) - (.+).pdf/mv \2 - \1.pdf/' | sh
也许它是混合的 交换由符号分隔的两个任意长度的字符串 和使用 sed 重命名多个文件
这不起作用
for file in *; do mv "$file" "$(echo "$file" | sed -r 's/(.+) - (.+).pdf/\2 - \1.pdf/')"
也不
rename 's/\([.]+\) - \([.]+\)\.pdf/\2 - \1\.pdf/' *
这有效
rename 's/(.+) - (.+).pdf/\2 - \1.pdf/' *
答案1
尝试这个
% ls -1
001-foobar.pdf
002-foobar.pdf
003-foobar.pdf
代码
% rename -n 's/([^-]+)-([^\.]+)\.pdf/$2-$1.pdf/' *.pdf
001-foobar.pdf -> foobar-001.pdf
002-foobar.pdf -> foobar-002.pdf
003-foobar.pdf -> foobar-003.pdf
笔记
(当测试正常时删除 -n 开关)
还有其他同名的工具可能能够也可能无法做到这一点,所以要小心。
如果运行以下命令 ( GNU
)
$ file "$(readlink -f "$(type -p rename)")"
你有一个像这样的结果
.../rename: Perl script, ASCII text executable
并且不包含:
ELF
那么这似乎是正确的工具 =)
如果不是,则将其设为默认值(通常已经是这种情况)Debian
并衍生如下Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(替换为您的命令/path/to/rename
的路径。perl's rename
如果您没有此命令,请搜索包管理器来安装它或手动做
最后但并非最不重要的一点是,这个工具最初是由 Perl 之父 Larry Wall 编写的。
答案2
我假设文件名遵循模式author - name.pdf
,并且author
和都可以包含除空格name
之外的任何有效字符。-
find . -type f -name '* - *.pdf' \
-execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
这将查找当前目录中名称与模式匹配的所有常规文件* - *.pdf
。
对于每个这样的文件,都会执行一个子 shell。子 shell 执行以下操作:
b=${1% - *} # pick out the start of the filename
e=${1#* - } # pick out the end of the filename
# Combine $b and $e into a new filename while removing ".pdf" from
# the end of the original filename and adding it to the end of
# the new filename instead.
mv "$1" "${e%.pdf} - $b.pdf"
测试它:
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 arr! - Boaty McBoatface.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 hello world - bingo-night!.pdf
$ find . -type f -name '* - *.pdf' -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 Boaty McBoatface - arr!.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 bingo-night! - hello world.pdf
再次运行它会将名称交换回原来的名称。