6

同じ名前のファイルがたくさんあり、次のようなディレクトリ構造(簡略化)があります。

 ../foo1/bar1/dir/file_1.ps  
 ../foo1/bar2/dir/file_1.ps  
 ../foo2/bar1/dir/file_1.ps
 .... and many more

それぞれのディレクトリに移動してこれらのpsファイルをすべて表示するのは非常に非効率的であるため、すべてを別のディレクトリにコピーしたいのですが、最初の2つのディレクトリの名前(私の目的に関連するもの)を含めますファイル名に。

私は以前にこのように試しましたが、すべて連続して名前が付けられているため、どのファイルがどこからのものかを取得できません。

#!/bin/bash -xv

cp -v --backup=numbered {} */*/dir/file* ../plots/; 

../plotsそれらをコピーするフォルダはどこにありますか。ただし、これらはfile.ps.〜x〜(xは数値)の形式になっているため、「。ps。〜*〜」を削除し、ps拡張子のみを次のように残します。

rename 's/\.ps.~*~//g' *;
rename 's/\~/.ps/g' *;

次に、psファイルには数百のポイントがあり、開くのに時間がかかることがあるので、それらをjpgに変換します。

for file in * ; do convert -density 150 -quality 70 "$file" "${file/.ps/}".jpg; done;

ディレクトリを手動で変更する必要があるため、これは実際には機能するbashスクリプトではありません。

それを行う最良の方法は、コピーされたファイル名に組み込まれている最初の2つのディレクトリの名前で始まるファイルをコピーすることだと思います。

どうすればこの最後のことを行うことができますか?

4

2 に答える 2

7

ディレクトリのレベルが2つしかない場合は、次を使用できます。

for file in */*/*.ps
do 
    ln "$file" "${file//\//_}"
done

/これにより、各psファイルが調べられ、 sが。に置き換えられた現在のディレクトリにハードリンクされ_ます。ファイルを編集するつもりで、元のファイルを更新したくない場合は、cp代わりに使用します。ln

任意のディレクトリレベルでは、bash固有を使用できます

shopt -s globstar
for file in **/*.ps
do 
    ln "$file" "${file//\//_}"
done

しかし、それらすべてを1つのディレクトリにコピーする必要がありますか?ですべてを開くことができるyourreader */*/*.ps場合があります。これは、読者によっては、フルパスを見ながら1つずつ参照できる場合があります。

于 2013-02-14T17:04:56.430 に答える
3

検索コマンドを実行して、最初に次のように名前を出力する必要があります

find . -name "file_1.ps" -print

次に、それらのそれぞれを繰り返し処理し、/「-」または次のような他の文字の文字列置換を行います

${filename/\//-}

一般的な構文は${string/substring/replacement}です。次に、それを必要なディレクトリにコピーできます。完全なスクリプトは次のように記述できます。まだテストしていないので(現時点ではLinuxではない)、構文エラーが発生した場合はコードを微調整する必要があるかもしれません;)

for filename in `find . -name "file_1.ps" -print`
do
     newFileName=${filename/\//-}
     cp $filename YourNewDirectory/$newFileName
done

上記のスクリプトを他のディレクトリに配置する場合は、スクリプトを同じルートディレクトリに配置するか、findコマンドを変更して特定のディレクトリを検索する必要があります。

参考文献

于 2013-02-14T17:00:25.157 に答える