私は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
。