ディレクトリ内にネストされた多数のファイル(ディレクトリごとに1つのファイル)を処理する必要があります。これは次のようになります。
fred/result.txt
john/result.txt
mary/result.txt
...
現在、次のコマンドを使用して、これらの各ファイルを処理しています。
find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;
このコマンドの最後に追加して、ファイル名をfred.txt
に変更できるものを探しています。 などなど、後でファイルを親ディレクトリに移動して、ディレクトリの余分なレイヤーを削除します。
これを行うための最良の方法は何でしょうか?
承認された回答:
従来のアプローチを使用できます:find
while read
コンボ:
デモ:
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%Pn" | while read FILE ; do DIR=$(dirname "$FILE" );
> mv ."$FILE" ."$DIR""$DIR".txt;done
$> ls
fred/ jane/ john/
$> ls *
fred:
fred.txt
jane:
jane.txt
john:
john.txt
echo
を使用する mv
を使用する前に ファイルを使用して行をテストします。
マイナーな改善
bash
への呼び出しを埋め込むことができます execに、パラメータ拡張(具体的にはプレフィックスの削除)を使用します。基本的には、exec呼び出しにスクリプトを埋め込みます。
$> find "$PWD" -type f -name "results.txt" -exec bash -c ' DIR=$( dirname "{}" ); echo "{}" "$DIR"/"${DIR##*/}".txt ' ;
/home/xieerqi/TESTDIR/fred/results.txt /home/xieerqi/TESTDIR/fred/fred.txt
/home/xieerqi/TESTDIR/jane/results.txt /home/xieerqi/TESTDIR/jane/jane.txt
/home/xieerqi/TESTDIR/john/results.txt /home/xieerqi/TESTDIR/john/john.txt
コマンドを一般的にするには(results.txt
だけでなく、任意のファイルで機能します) )-name "results.txt"
を削除するだけです 部。これに対する代替のPythonソリューションについては、この投稿も参照してください。