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


12

各ファイルの名前を変更して名前からランダムな文字列部分を削除しながら(つまり、-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」の順に続きます。日時スタンプを含むすべての名前要素を保持したい。ランダムな文字列を削除したいだけです。

ランダムな文字列により、同じファイルの複数のバックアップが可能になります。ただし、この場合、fdupesを実行しただけで、重複はありません。したがって、ランダムな文字列を削除して、すべてのファイルを単純に復元できます。

それを行う1行のbashコマンドを探しています。

それでもうまくいかない場合は、2つ以上の手順で実行できます。通常はKRenameを使用しますが、この場合はbashで行う必要があります。(リモートで作業しています。)

回答:


7

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

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


1
慣れる必要があることがわかりpaxます。これは非常に便利なツールのようです。...それはより多くのディストリビューションでは標準ではありませんなぜ私は思ってしまう
MountainX

ウィキペディアによると、@ MountainXという良い質問はpax2005年からLinux Standard Baseにあります。これに代わるものであるGNUはcpio、おそらく最も機能の少ないGNUツールです。
グレアム14

1
最後の解決策に対して+1を使用します。この方法では、ファイルごとに異なるプロセスが開始されません。 ただし rename、Fedora / Red Hatでは異なります。この場合の使用方法はわかりません。
エリック

15

オプションを指定してcpコマンドを使用でき-aます

-a, --archive
       same as -dR --preserve=all

次に、forループを使用して、コピー中にすべてのファイルの名前を変更します。

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

準備完了。ソースディレクトリでこのコマンドを開始します。

説明:%%-*ハイフンの最初の出現の後のすべての文字を遮断/マイナスになる-.etf、再び終わりには、ファイルの拡張子を追加します。

さて、1つのライナーとして、すべてを1行に入れてください。:-) このような

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
ありがとう、%%-*ヒントのドキュメントを引用してもらえますか?私は興味がある。
-soyuka

3

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'

bashの場合:

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

1

cpその機能はありません。私cpioはそれができたことを思い出しますが、現在のマンページにはそうではないと書かれています。ただし、(gnu)にtar--transformオプションがあります:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

したがって、次のようなコマンドラインがあります。

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.