0

このコマンドを1行に減らすことができるかどうかだけに興味があります&&か?

find /backup/daily.1/var/www/ -iname "*.jpg" -type f >> ~/backuppath.txt
sed 's|/backup/daily.1||g' ~/backuppath.txt > ~/wwwpath.txt
paste -d " " ~/backuppath.txt ~/wwwpath.txt > ~/files.txt
while read line; do cp $line; done < ~/files.txt
4

3 に答える 3

1

これは、スペースを含むファイル名を処理しません。(これは重要ではありません。避けられないコメントを先取りするためにこれを述べるだけです。)

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
while read name; do cp $name ${name#/backup/daily.1}; done 

次のこともできます。

find /backup/daily.1/var/www/ -iname "*.jpg" \
    -type f -exec sh -c 'cp "$0" "${0#/backup/daily.1}"' {} \;

これは異常なファイル名をうまく処理します。

于 2012-11-28T14:39:51.423 に答える
1

私はそれを一行で書くつもりはありませんが、中間ファイルなしで書くことができます:

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
sed 's%/backup/daily.1\(.*\)%cp & \1%' |
sh -x

このsedコマンドは、ファイル名をプレフィックスと「残り」の2つのコンポーネントに分割し、/backup/daily.1それを完全なコピーコマンドに置き換えて、元の名前をプレフィックスのない名前にコピーします。の出力はsed、スクリプトとしてシェルに送られます。

シェルのメタ文字、スペース、または改行を含むファイル名がない限り、これは正常に機能するはずです。次のファイル名に改行または一重引用符が含まれない場合は、復元力を向上させることができます。

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
sed "s%/backup/daily.1\(.*\)%cp '&' '\1'%" |
sh -x

これにより、各ファイル名が一重引用符で囲まれます。

于 2012-11-28T14:44:09.630 に答える
0
find /backup/daily.1/var/www/ -iname "*.jpg" -type f \
 | sed 's|^/backup/daily\.1\(.*\)$|\0 \1|' \
 | ( while read origin dest; do cp "$origin" "$dest"; done)

式でsed

  • \0一致した文字列に置き換えられます。これは、行全体がこの場合です。
  • \1サブパターンの一致に置き換えられます。これは、行の後から最後までの\(.*\)すべてです。/backup/daily.1
于 2012-11-28T14:40:29.147 に答える