ディレクトリ内の複数のファイル名の記号で区切られた2つの文字列を置き換えます。

ディレクトリ内の複数のファイル名の記号で区切られた2つの文字列を置き換えます。

author - nameいくつかの書籍のファイル名の文字列をname - author。に変更したい。

ls * | sed -r 's/(.+) - (.+).pdf/mv \2 - \1.pdf/' | sh

たぶんそれは混合かもしれません 記号で区切られた任意の長さの2つの文字列を置き換えます。 そして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/renameperl'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

これらのファイルごとにサブシェルが実行されます。サブシェルは次のタスクを実行します。

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

もう一度実行すると、名前が元の名前に戻ります。

関連情報