ファイル名Xからファイル名Yに複数のファイルをコピーしますか?

ファイル名Xからファイル名Yに複数のファイルをコピーしますか?

私がしたいのは、辞書の範囲内のファイルをコピーすることです。

ファイルの例:

-rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
-rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
-rw-r--r--   4 root root    4096 Feb  2  2007 acpi.txt
-rw-r--r--   1 root root      48 Feb  8  2008 adjtime.jpg
-rw-r--r--   4 root root    4096 Feb  2  2007 alchemist.jpg

使用例:

  • 3つのファイルをからにコピーしますasps.cfgacpi.txt
  • 3つのファイルをからにコピーしますa2ps-site.cfgadjtime.jpg
  • 4つのファイルをからにコピーしますa2ps-site.cfgalchemist.jpg

それでは、一連のファイル(ファイル名Xからファイル名Yまで)をディレクトリにコピーする方法はありますか?

良い:cp filenameX ... filenameY destination/

ベストアンサー1

一般的なアプローチは、一連のファイル名を印刷するシェル関数を定義することです。この関数の単純なバージョンは、現在のディレクトリの2つのファイル名の間にあるすべてのファイルを一覧表示します。

range()
{
    ls | sed -n "/^$1\$/,/^$2\$/p"
}

これはsed範囲を使用して、指定された2つの文字列($1と)$2の間のすべての項目を印刷します。

cp(1)その後、コマンドでこの機能を使用できます。

cp $(range asps.cfg acpi.txt) /destination/path

ファイル名にスペースが含まれていると、この操作は失敗します。これを行うにはもう少し洗練されなければなりません。

range asps.cfg acpi.txt | xargs -d '\n' -I {} cp {} /destination/path

ファイル名に改行文字(\ n)が含まれていると、操作は失敗します。そうなる可能性はほとんどないので、この問題を解決することは読者の練習問題として残しておきます。

これを他のシェル関数にまとめることができます。

cprange()
{
    [ $# -eq 3 ] || { echo "usage: cprange start end dir" >&2; return 1;}
    range "$1" "$2" | xargs -d '\n' -I {} cp {} "$3"
}

次のように使用してください。

cprange filenameX filenameY destination

範囲は、現在のディレクトリのファイル名にのみ適用されることに注意してください。これをさまざまな方法で拡張できます(ディレクトリパラメータの追加range、パラメータからrange使用へのパス抽出dirnameなど)。しかし、要求事項に応じて決定させていただきます。詳細が必要な場合はこちらまでお問い合わせください。

おすすめ記事