ファイルを1つまたは2つのディレクトリにコピーして名前を変更します。

ファイルを1つまたは2つのディレクトリにコピーして名前を変更します。

私はLinuxを初めて使用し、現在ダウンロードしたファイルをクリーンアップしようとしています。

.srtデフォルトでは、サブディレクトリからファイルをインポートし、他のファイルと一緒にデフォルトディレクトリに移動して名前を変更したいと思います。

現在実行中のスクリプトは次のとおりです。

find "/foo/bar" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "${path%/*}/${path##*/}.${filename}" ' sh_cp {} \;

このアプローチは、構造が次のような場合に十分です。

├── Some.Folder.Name
    ├── Some.Video.Name.mkv
    └── Subs
        └── 2_Eng.srt

2_Eng.srtコピーされ、Some.Folder.Name名前がに変わりますSome.Folder.Name.2_Eng.srt

.srtただし、次のようにフォルダに二重にネストされたいくつかのファイルが見つかりました。

├── Some.Other.Folder.Name
    ├── Some.Other.Video.Name.mkv
    ├── Some.Other.Video.Name2.mkv
    └── Subs
        ├── Video1
        │   └── 2_Eng.srt
        └── Video2
            └── 2_Eng.srt

私が実行しているスクリプトは適切に名前を変更しますが()そのディレクトリVideo1.2_Eng.srtにのみ移動します。Subs私は彼らがSome.Other.Folder.Name

path%/*詳細シェルパラメータ1##*/拡張からスクリプトを取得したスレッド。それでは、ファイルを置く特定のディレクトリを隔離する方法はありますか?ディレクトリ名は変更できますが、常にですfoo/bar

私が達成したいことは可能ですか?

ベストアンサー1

ある意味、あなたが要求することは不可能です。考慮事項:  find同様の名前が見つかった場合

/foo/bar/Some.Other.Folder.Name/Subs/Video1/2_Eng.srt

このコマンドは何をすべきですか?ファイルを次の場所に移動したいことを「知っています」。

/foo/bar/Some.Other.Folder.Name/Video1.2_Eng.srt

- 私のポイントは、ファイル名では明確ではないということです。

ファイルを移動する場所を指定する必要があります。

find /foo/bar -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "${1}" "/foo/bar/${path##*/}.${filename}" ' sh_cp {} \;

これをスクリプトに入れると、起動ディレクトリをパラメータ化できるようにする必要があります。しかし、問題があります。  cpコマンドは、独自の引数リストを持つサブシェルにあります。私はこのアプローチが安全だと思います。

find "$1" -type f -iname '*.srt' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    cp "$1" "$2/${path##*/}.${filename}" ' sh_cp {} "$1" \;

$1これは、スクリプトの開始ディレクトリを2番目の引数としてサブシェルに渡すためです$2

おすすめ記事