交换目录的多个文件名中由符号分隔的两个字符串

交换目录的多个文件名中由符号分隔的两个字符串

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

再次运行它会将名称交换回原来的名称。

相关内容