내 입력 폴더에 하위 폴더 등이 files_input
포함되어 있고 이러한 모든 하위 폴더에 다른 하위 폴더가 있는 경우. 각 하위 폴더에는 .01-2015
02-2015
03-2015
index.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~ 등을 추가하여 파일을 복제합니다.