ディレクトリ名の文字数に基づいてファイル名を変更する

ディレクトリ名の文字数に基づいてファイル名を変更する

次のディレクトリがたくさんあります。

./lab-results.n3668.2017-01-16
./lab-results.n471.2017-02-24
./tests.n287.2017-01-28
./tests.n4501.2017-03-04

残念ながら、ファイル1つだけしかし、名前は同じです。

./lab-results.n3668.2017-01-16/lab-results.pdf
./lab-results.n471.2017-02-24/lab-results.pdf
./tests.n287.2017-01-28/tests.pdf
./tests.n4501.2017-03-04/tests.pdf

次のように名前を変更した後、これらのファイルをすべて移動したいと思います。

./lab-results.n3668.pdf
./lab-results.n471.pdf
./tests.n287.pdf
./tests.n4501.pdf

したがって、shスクリプトを見たようですが、ディレクトリ名の文字の一部を使用してファイルの将来の名前を構成する方法がわかりません。

lab-results.n9999 : max number available, will not change
tests.n9999 : max number

他のディレクトリもありますが、そのディレクトリの名前の後には常に複数の数字が表示されます。

./xxxxxxx.n9999
./yyyyyy.n9999
./zzz.n9999

どんなアドバイスや助けにも感謝します。私はLinuxディストリビューションでbash 4.3.11(1)を使用しています。

答え1

 for F in */* ; do echo mv "$F" "${F/.2017*/.pdf}" ; done

またはスクリプトとして:

#! /bin/bash
for F in */*
do
    echo mv "$F" "${F/.2017*/.pdf}"
done

ただそれが何をするかを示すだけです。ご希望の場合は削除しechoて実行してみてください。

秘訣は次のとおりです。ファイル名+パスで検索して${F/.2017*/.pdf}に置き換えます。.2017*.pdf

答え2

rename 's|^(\./[^.]*\.[^.]*).*|$1.pdf|' ./*.*.*/*.pdf

  • 少なくとも2つのポイントがあり、PDFファイルを含むディレクトリを選択します。
  • その後、最初の2つのポイントまで情報を保持し、新しいファイル名を作成します。
  • これはDebianベースのシステムにあると仮定renameします。他のシステムまたは 。perl-renameperl-renamerenameperl-renameprename

関連情報