検索を使用してディレクトリコピーを作成する

検索を使用してディレクトリコピーを作成する

多くのサブディレクトリを含むディレクトリがあります。だから

/usr/local/src/ccl/ccl-1.8/x86-headers$ ls
elf  gl  gmp  gnome2  gtk2  jni  libc

C各ディレクトリにはファイルを含むサブディレクトリがありますpopulate.sh。同じ構造の並列サブディレクトリセットを作成したいのですが、ディレクトリ名の後にランダムな値を追加したいです(任意の値はすべての場合で同じである必要があります)。ファイルを含むCサブディレクトリのみが含まれていますpopulate.sh。これらのディレクトリには、populate.shこのファイルに加えて他のファイルが含まれています。

これはmakefile用であるため、単純化のために標準のUnixユーティリティを使用する必要があります。その-execフラグを使用して検索または機能するつもりですが、xargs文書を理解するのに問題があり、シェルスクリプトの経験がほとんどありません。 Perlはうまくいくかもしれませんが、私はそれを使ったことがないので、ここでは使いたくありません。

mktemp -u --tmpdir=.過去にも同様のアプローチを使用してランダムな文字列を生成しましたが、理想的ではないため、他の提案を受け入れることができます。理想的にはそのような名前をつけたいと思いますlibc.tmp_xw3st。つまり。tmp_その後には5桁の英数字文字列が続きます。

これまで、私はトップレベルのディレクトリのリストを取得する方法を見つけました。 :-)

find . -maxdepth 1 -type d -print0

../gmp./jni./gl./elf./libc./gtk2./gnome2

より完全なディレクトリのリストはこの記事の最後にあります。全体的に、私はx86-headers/libc.tmpvalue追加のファイルだけを含む別のディレクトリを作成したいと思いますx86-headers/libc.tmpvalue/C/populate.sh

1つの可能なアプローチの概要は、次の2つのステップでこの問題を処理することです。

ステップ1:最上位ディレクトリリストを巡回し、を使用したり、パイプで接続して使用するなど、対応するディレクトリfind構造を作成するために使用します。dirname.tmpvalue/C/execxargsmkdir -p

ステップ2:トップレベルディレクトリリストを再実行し、サブディレクトリpopulate.shとしてcpを実行しますC。理論的には、ディレクトリリストは呼び出し間で変更される可能性があるため、これは少し混乱しますが、findこの場合は問題になりません。

/usr/local/src/ccl/ccl-1.8/x86-headers$ ls -laR

[...]

./jni:
total 96
drwxr-sr-x 3 faheem staff  4096 Jul 31 00:53 .
drwxr-sr-x 9 faheem staff  4096 Jul 31 00:53 ..
drwxr-sr-x 2 faheem staff  4096 Jul 31 00:53 C
-rw-r--r-- 1 faheem staff 19535 Jul 31 00:53 constants.cdb
[more .cdb files]

./jni/C:
total 12
drwxr-sr-x 2 faheem staff 4096 Jul 31 00:53 .
drwxr-sr-x 3 faheem staff 4096 Jul 31 00:53 ..
-rw-r--r-- 1 faheem staff  148 Jul 31 00:53 populate.sh

./libc:
total 1276
drwxr-sr-x 3 faheem staff   4096 Jul 31 00:53 .
drwxr-sr-x 9 faheem staff   4096 Jul 31 00:53 ..
drwxr-sr-x 2 faheem staff   4096 Jul 31 00:53 C
-rw-r--r-- 1 faheem staff 593125 Jul 31 00:53 constants.cdb
[more .cdb files]

./libc/C:
total 20
drwxr-sr-x 2 faheem staff  4096 Jul 31 00:53 .
drwxr-sr-x 3 faheem staff  4096 Jul 31 00:53 ..
-rwxr-xr-x 1 faheem staff 10544 Jul 31 00:53 populate.sh

ベストアンサー1

find再帰が含まれていないため機能しません。

for x in */C/populate.sh; do
  mkdir -- "${x%%/*}$suffix"
  mkdir -- "${x%%/*}$suffix/C"
  cp -p -- "$x" "./${x%%/*}$suffix/C"
done

ファイルの変更時間を保存したくない場合は、この-pオプションを削除してください。cp

任意サフィックス生成、BSD/Linuxmktempできるだけ携帯性が良い。

suffix=$(mktemp -u tmp_XXXXX)

不明瞭にランダムに見え、POSIXと互換性があることを望む場合は、毎秒変更され、場所に応じて異なる文字列が提供されます。 POSIXツールだけではこれより良い結果が得られません。

suffix=$({ hostname; pwd; date; } |
         cksum | uuencode -m /dev/stdin | awk 'NR==2 {print substr($0,3,5)}')

このコードをmakefileに入れる場合は、次の点に注意してください。

  • すべての兆候が2倍に増加しました$
  • 区切られたシェルコマンドの代わりに、すべてのコードを1行に入力します;(バックスラッシュ+改行+タブを使用してmakefileに改行を挿入できますが、そのシーケンスはシェルコマンドをビルドすると削除されます)。
  • set -eエラーが発生した場合は、中断するためにシェルフラグメントを起動してください。

おすすめ記事