各ファイルの名前を変更して名前からランダムな文字列の部分を削除する(つまり、-2b0fd460_1426b77b1ee_-7b8e)ときに、バックアップディレクトリのすべてのファイルをユーザーのディレクトリにコピー(日付が変更されないアーカイブスタイル)するにはどうすればよいですか?
cp from:
/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf
に:
/home/user/data/Erp.2014.02.16_16.57.03.etf
各ファイルは常に「Erp」で始まります。日時スタンプ文字列、ランダム文字列、拡張子「.etf」の順に続きます。日時スタンプを含むすべての名前要素を保持したい。ランダムな文字列を削除したいだけです。
ランダムな文字列により、同じファイルの複数のバックアップが可能になります。ただし、この場合、私はfdupeを実行しただけで、重複はありません。したがって、ランダムな文字列を削除して、すべてのファイルを単純に復元できます。
それを行うための1行のbashコマンドを探しています。
それがうまくいかない場合は、2つ以上のステップで実行できます。通常はKRenameを使用しますが、この場合はbashで実行する必要があります。 (私はリモートで作業しています。)
pax
は、これを一度にすべて実行できます。あなたがすることができます:
cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data
pax
はデフォルトで時間を保持しますが、-pe
すべてを保存する(ルートとして実行するのが最適)または-pp
パーミッションを保持するには、例:
cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data
それ以外の場合(pax
は通常デフォルトでは使用できません)、確かにコピーしてからrename
を実行することをお勧めします。
cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf
この方法では、ファイルごとに異なるプロセスが開始されることはありません。
cp
コマンドは-a
オプション
-a, --archive
same as -dR --preserve=all
次に、forループを使用して、コピー中にすべてのファイルの名前を変更します。
for file in Erp*etf; do
cp -a $file destinationDirectory/${file%%-*}.etf
done
いいよこのコマンドをソースディレクトリで開始します。
説明:%%-*
は、ハイフン/マイナスが最初に出現した後、すべての文字を切り捨てます-
そしてその .etf
最後に再びファイル拡張子を追加します。
さて、そしてワンライナーとして、それをすべて一行に入れてください。 :-) このような
for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done
Zshでは、 zmv
を使用します。これを.zshrc
:
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
次に使用します
zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'
バッシュで:
zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'
Zshがない場合、POSIXの方法 paxを使用 (これによりディレクトリが再帰的にコピーされます)。
Zshもpaxもない制限されたシステムを使用している場合は、ループを使用できます。
for source in /backup/path/data/*-*.etf; do
basename=${source##*/}
cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done
cp
にはその機能はありません。私はcpio
がそれを行うことができたことを思い出しますが、現在のマンページはそうではないと言っています。ただし、(gnu)tar
には--transform
オプション:
--transform, --xform EXPRESSION
use sed replace EXPRESSION to transform file names
したがって、次のようなcmdlineがあります。
(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)