web-dev-qa-db-ja.com

コピー中にファイルの名前を変更する方法は?

各ファイルの名前を変更して名前からランダムな文字列の部分を削除する(つまり、-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で実行する必要があります。 (私はリモートで作業しています。)

12
MountainX

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

この方法では、ファイルごとに異なるプロセスが開始されることはありません。

7
Graeme

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
15
erik

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)
1
Ricky Beam