**ファイル名にスペースが含まれるファイルの場合:

**ファイル名にスペースが含まれるファイルの場合:

ディレクトリ内の複数の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

関連情報