1

ファイルとフォルダーを含む特定のフォルダー構造をコピーして、コピーがどこまで進んでいるかをユーザーに知らせる出力を持ちたくありません。

現在、以下を使用して、特定のフォルダーを除いて構造をコピーしています。

cp -rfv !(Project.buildoutput) $Project_SYNC_DIR

しかし、cp -v出力は非常に醜いです:

> _55_studio.tests/singles/CustomIdentifier.file -> /Users/<path>/_55_studio.tests/singles/CustomIdentifier.file build.sh
> -> /Users/<path>/build.sh

きれいな名前でレベル 1 要素のみを出力することは可能ですか。

私の現在のフォルダ構造:

_55_studio
--singles
--mixed
_55_studio.tests
--singles
build.sh
project.settings

コピー中に次のように出力します。

Copy folder _55_studio
Copy folder _55_studio.tests
Copy file build.sh
Copy file project.settings

これを達成するための効率的な方法と方法はありますか?

BR、マイベックス

4

3 に答える 3

1

ステップ 1、ディレクトリを抽出します。

sed -e 's#^\([^/]\+\) -> .*$#\1#g' -e 's#^\([^/]\+\)/.*$#\1#g'

最初の置換では、次のように行を置換します。

`file_name' -> `path/to/copy/file_name'

に:

file_name

2 番目の置換では、次のように行を置換します。

`path/to/file' -> `other/path/to/copy/file'

に:

path

` と ' を追加したことに注意してください。これは、私の cp がそれらを追加するためです。

ステップ 2、重複を削除します。

uniq

ステップ 3、それがファイルかディレクトリかを確認します。

while read f; do \
  if [ -d $f ]; then \
    echo Copy folder $f \
  else \
     echo Copy file $f \
  fi \
done

したがって:

cp -rfv !(Project.buildoutput) $Project_SYNC_DIR | \
  sed -e 's#^`\([^/]\+\)'"'"' -> .*$#\1#g' \
      -e 's#^`\([^/]\+\)/.*$#\1#g' | \
  uniq | \
  while read f; do \
    if [ -d $f ]; then \
      echo Copy folder $f; \
    else \
      echo Copy file $f; \
    fi \
  done
于 2013-01-11T10:50:07.957 に答える
1

あなたが尋ねたものに非常に近づくための効率的な方法:

for src in !(Project.buildoutput); do 
    stat -c "Copy %-14F %n" "${src}"; cp -rf "$src" $Project_SYNC_DIR; done

(shopt -s extglob拡張グロビングの必要性: ! で一致を反転)

または、すべてのファイル/ディレクトリを表示するには

unbuffer cp -rfv !(Project.buildoutput) $Project_SYNC_DIR | 
    while read src dd dst; do stat -c "Copy %-14F %n" "$src"; done 

上記ではGNUstatを使用しましたが、stat -f "Copy %-14SHT %N"代わりに *BSD を使用します。

私の(GNU coreutils 6.9)cp -vは、出力に壊れた引用符を出力することを主張しています。上記を使用するための簡単なハックはtr、パイプラインに a を追加することです:

...  | tr -d \`\' | while ...

ファイル/ディレクトリ名にスペースまたは一重引用符が含まれている場合は、より複雑なものが必要になります。

perl に面倒な作業を任せたい場合 (および `' クォートを処理したい場合);

... | perl -ne $'/\`(.*)\' -> \`(.*)\'/ && 
  printf("Copy %-14s %s\n",(-f $1 ? "file" : -d $1 ? "directory" : "<other>"),$1);'

多くのファイルがある場合、これはより効率的です。これは、コピーされたファイル/ディレクトリごとに1つではなく、1つの追加プロセスのみが必要になるためです。

コピー中にフィードバックを増やすための一般的な解決策は、rsync代わりに次を使用することです。

rsync --progress -hrv src/ dest/ 

rsyncよりも効率的ですcp。必要のないファイルはコピーしません。" -W" を追加すると、 のように強制的にコピーされますcp

于 2013-01-11T11:17:00.880 に答える
1

ここでは、を使用してワンライナーでfind

find "/path/to/dir" -maxdepth 1 -mindepth 1 -name "Project.buildoutput" -prune -o -exec /bin/bash -c "echo -en \"Copy \"; \
                                                                                                      [ -d '{}' ] && echo -en \"folder \";\
                                                                                                      [ -f '{}' ] && echo -en \"file \"; \
                                                                                                      basename '{}'; \
                                                                                                      cp -fr '{}' \"$Project_SYNC_DIR\"" \;

出力:

Copy folder _55_studio
Copy folder _55_studio.tests
Copy file build.sh
Copy file project.settings
于 2013-01-11T10:41:10.750 に答える