23

サーバーにいくつかのファイルを含むフォルダーがあります。これらは自動化されているため、毎日新しいファイルが自動的に取得され、古いファイルが上書きされます。そのため、このデータのバックアップを取得したいと考えています。コピー中にファイルの名前を現在の日付に変更して、これらすべてのファイルを別のフォルダーにコピーするにはどうすればよいですか。

例:4つのファイルを含むfolder1という名前のフォルダーがあります。このフォルダーのパスは、home/webapps/project1/folder1 です。

  1. aaa.csv
  2. bbb.csv
  3. ccc.csv
  4. ddd.csv

ここで、これら 4 つのファイルすべてを、folder2 という名前の別のフォルダーにコピーしたいと考えています。このフォルダーのパスは、home/webapps/project1/folder2 です。これらのファイルをコピーするときに、各ファイルの名前を変更し、現在の日付をファイルに追加したいと考えています。だから、folder2の私のファイル名は..

  1. aaa091012.csv
  2. bbb091012.csv
  3. ccc091012.csv
  4. ddd091012.csv

このためのシェルスクリプトを書きたいと思います。これに関連するアイデアやサンプル スクリプトを教えてください。

4

6 に答える 6

41

ではbash、ファイル名にスペースが含まれていない場合:

cd /home/webapps/project1/folder1
for f in *.csv
do 
   cp -v "$f" /home/webapps/project1/folder2/"${f%.csv}"$(date +%m%d%y).csv
done
于 2012-09-10T16:21:58.497 に答える
4

以下のようなスクリプトを使用できます。必要な形式に合わせて日付オプションを変更するだけです。

#!/bin/bash

for i in `ls -l /directroy`
do
cp $i /newDirectory/$i.`date +%m%d%Y`
done
于 2012-09-10T16:15:33.227 に答える
2

ファイル名と拡張子を分割する適切な方法があります: Extract filename and extension in Bash

次のように適用できます。

date=$(date +"%m%d%y")
for FILE in folder1/*.csv
do
    bname=$(basename "$FILE")
    extension="${bname##*.}"
    filenamewoext="${bname%.*}"
    newfilename="${filenamewoext}${date}.${extension}
    cp folder1/${FILE} folder2/${newfilename}
done
于 2012-09-10T17:48:35.473 に答える
2
path_src=./folder1
path_dst=./folder2
date=$(date +"%m%d%y")
for file_src in $path_src/*; do
  file_dst="$path_dst/$(basename $file_src | \
    sed "s/^\(.*\)\.\(.*\)/\1$date.\2/")"
  echo mv "$file_src" "$file_dst"
done
于 2012-09-10T16:24:30.597 に答える
1
cp --archive home/webapps/project1/folder1/{aaa,bbb,ccc,ddd}.csv home/webapps/project1/folder2
rename 's/\.csv$/'$(date +%m%d%Y).csv'/' home/webapps/project1/folder2/{aaa,bbb,ccc,ddd}.csv

説明:

  • --archiveファイルが同じ所有権と許可でコピーされることを保証します。
  • foo{bar,baz}に展開されfoobar foobazます。
  • renameは、まさにこの種の置換を行うための一般的に利用可能なプログラムです。

PS:これには使用しないlsでください。

于 2012-09-11T11:09:14.560 に答える