파일을 재귀적으로 복사하고 이름 바꾸기

파일을 재귀적으로 복사하고 이름 바꾸기

내 입력 폴더에 하위 폴더 등이 files_input포함되어 있고 이러한 모든 하위 폴더에 다른 하위 폴더가 있는 경우. 각 하위 폴더에는 .01-201502-201503-2015index.html

이 모든 파일을 동일한 폴더에 있는 별도의 파일처럼 보이도록 index.html이라는 폴더에 복사하려면 어떻게 해야 합니까 ? files_output물론 이름을 바꿔야 합니다. 그렇게 하기 위해 --backup을 사용해 보았습니다...

나는 열심히 노력했다

find files_input -name \*.html -exec cp --backup=t '{}' files_output \;

번호를 매기되 파일 하나만 복사하고 다른 파일은 복사하지 마세요.

이것이 어떻게 바뀔지 모르겠지만 zsh를 사용하고 있으며 버전은 다음과 같습니다.

   $ zsh --version | head -1
   zsh 5.0.2 (x86_64-pc-linux-gnu)
   $ bash --version | head -1
   GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
   $ cp --version | head -1
   cp (GNU coreutils) 8.21
   $ find --version | head -1
   find (GNU findutils) 4.4.2

아이디어가 있나요?

편집하다:

예를 들어 다음을 실행해 보세요.

cp --backup=t files_input/01-2015/index.html files_output

5번 연속으로 files_output폴더에 index.html이 표시됩니다! CP가 고장났나요? 5개의 다른 파일이 없는 이유는 무엇입니까?

답변1

zsh귀하가 사용자 인 경우 :

$ tree files_input
files_input
|-- 01_2015
|   |-- subfolder-1
|   |   `-- index.html
|   |-- subfolder-2
|   |   `-- index.html
|   |-- subfolder-3
|   |   `-- index.html
|   |-- subfolder-4
|   |   `-- index.html
|   `-- subfolder-5
|       `-- index.html
|-- 02_2015
|   |-- subfolder-1
|   |   `-- index.html
|   |-- subfolder-2
|   |   `-- index.html
|   |-- subfolder-3
|   |   `-- index.html
|   |-- subfolder-4
|   |   `-- index.html
|   `-- subfolder-5
|       `-- index.html
(etc.)
$ mkdir -p files_output
$ autoload -U zmv
$ zmv -C './files_input/(*)/(*)/index.html' './files_output/$1-$2-index.html'
$ tree files_output
files_output
|-- 01_2015-subfolder-1-index.html
|-- 01_2015-subfolder-2-index.html
|-- 01_2015-subfolder-3-index.html
|-- 01_2015-subfolder-4-index.html
|-- 01_2015-subfolder-5-index.html
|-- 02_2015-subfolder-1-index.html
|-- 02_2015-subfolder-2-index.html
(etc.)

여기서 일어나는 일은 명령을 zmv사용할 수 있게 만드는 것입니다 autoload -U zmv. 이 명령은 일치하는 파일의 이름을 바꾸거나 복사하거나 연결하는 데 사용됩니다.zsh 확장된 와일드카드 패턴.

우리는 옵션을 사용하여 zmv알려 -C줍니다.복사파일을 이동하는 대신(기본값). 그런 다음 복사하려는 파일과 일치하는 패턴을 지정합니다 ./files_input/(*)/(*)/index.html. 둘 다 (*)2단계 하위 디렉터리 이름과 일치하며 각 파일의 새 이름에 사용할 수 있도록 괄호 안에 넣습니다. 각 파일의 새 이름은 두 번째 인수입니다. ./files_output/$1-$2-index.html여기서 $1$2는 패턴의 대괄호로 캡처된 문자열입니다(예: 하위 디렉터리 이름에 대한 역참조). 두 매개변수 모두 작은따옴표로 묶어야 합니다.

답변2

다음을 수행할 수 있습니다.

cd -P files_input/.. &&
mkdir files_output   &&
pax -rws'|.*/\(.*\)/\(.*\)|\1.\2|' \
     files_input/??-2015/index.html files_output

이는 전 세계적으로 모든index.html하위 디렉터리의 폴더에 있는 파일./files_input두 문자, 대시, 문자열로 이름을 지정하세요.2015이 모든 파일을 새로 생성된files_output비슷한 이름의 폴더??-2015.index.html.

답변3

{}나에게 맞는 것처럼 보이는 주변 따옴표를 제거해보십시오 .

$ find foo* files_output -ls
 27002    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo1
 25373    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo1/index.html
 27003    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo2
 25374    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo2/index.html
 48941    0 drwxrwxr-x   2 steve    steve          40 Jul  2 15:06 files_output
$ find foo* -name index.html -exec cp --backup=t {} files_output \;
$ find files_output -ls
 48941    0 drwxrwxr-x   2 steve    steve          80 Jul  2 15:08 files_output
 51354    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html
 49595    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html.~1~
$

제 경우에는 유틸리티 버전이 아래와 같았습니다.

$ bash --version | head -1
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
$ cp --version | head -1
cp (GNU coreutils) 8.21
$ find --version | head -1
find (GNU findutils) 4.5.11
$

답변4

이것은 나에게 효과적입니다.

find files_input -name "\20171123*" -exec cp --backup=t --target-directory=files_output {} +

'files_input'의 디렉터리 및 하위 디렉터리의 패턴과 일치하는 모든 파일을 -name'file_output' 디렉터리에 복사하고, ~1~, ~2~ 등을 추가하여 파일을 복제합니다.

관련 정보