ディレクトリ内の複数のcソースファイルをコピーして名前を変更したいと思います。
次のようにコピーできます。
$ cp *.c $OTHERDIR
しかし、すべてのファイル名にプレフィックスを付けたいと思います。
file.c --> old#file.c
これを1つのステップでどのように実行できますか?
答え1
ループfor
:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
私はしばしば進行状況を観察する-v
オプションを追加します。cp
答え2
シェルワイルドカードを使用できます。
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
形式for variable in GLOB
が拡張されます。全体的な状況一致するすべてのファイル/ディレクトリ(隠しファイルを除く)に対して繰り返し、各ファイル/ディレクトリを順番に保存します$variable
(上記の例では$f
)。したがって、私が表示するコマンドは、隠されていないすべてのファイルを繰り返しコピーしてプレフィックスを追加します。
答え3
xargs
これはtr
、およびglobbingを使用する単一のライナーです。ある程度価値があるかもしれません。
echo *.c | tr ' ' '\n' | xargs -n1 -I{} cp "{}" "PREFIX{}"
*.c
これにより、一致するすべてのファイルがスペースで区切られた文字列として返されます。次に、tr
余分なスペースを改行文字(気づくスペースを含むファイル名はテストされません**)。次に、xargs
各ファイル名を入力し、cp
適切な名前とプレフィックスを使用して実行します。
*.c
他の便利なグローブに変更することができます。xargs
セクションの他のプレフィックスcp
も使用できます。
**ファイル名にスペースが含まれるファイルの場合:
(find
サポートが必要-print0
)上記と同様にfind
出力に使用できます。無効- 区切りファイルリストと区切りxargs
フラグで調整無効
find . -name '*.c' -print0 | xargs -0 -n1 -I{} cp "{}" "PREFIX{}"
答え4
必要な場合、これは再帰的なアプローチです。
for f in `find . -name \*.c`; do name="${f//\.\//__}"; fileName="${name//\//_}" ; echo "Copying $f as $OTHERDIR/old#$fileName"; cp -- "$f" "$OTHERDIR/$fileName"; done