私がしたいのは、辞書の範囲内のファイルをコピーすることです。
ファイルの例:
-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.cfg
。acpi.txt
- 3つのファイルをからにコピーします
a2ps-site.cfg
。adjtime.jpg
- 4つのファイルをからにコピーします
a2ps-site.cfg
。alchemist.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
など)。しかし、要求事項に応じて決定させていただきます。詳細が必要な場合はこちらまでお問い合わせください。