모든 하위 디렉토리에 파일을 재귀 적으로 추가


14

모든 하위 디렉토리뿐만 아니라 현재 디렉토리에 파일을 재귀 적으로 추가하거나 터치하는 방법은 무엇입니까?

예를 들어,
이 디렉토리 트리를 돌리고 싶습니다 :

.
├── 1
   ├── A
   └── B
├── 2
   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

으로

.
├── 1
   ├── A
      └── file
   ├── B
      └── file
   └── file
├── 2
   ├── A
      └── file
   └── file
├── 3
   ├── A
      └── file
   ├── B
      ├── file
      └── I
          └── file
   └── file
└── file

9 directories, 10 files

답변:


14

어때요?

find . -type d -exec cp file {} \;

보낸 사람 man find:

   -type c
          File is of type c:
           d      directory

   -exec command ;
          Execute  command;  All following arguments to find are taken 
          to be arguments to the command until an  argument  consisting 
          of `;' is encountered.  The string `{}' is replaced by the 
          current file

따라서 위의 명령은 모든 디렉토리를 찾고 cp file DIR_NAME/각 디렉토리에서 실행 됩니다.


또는를 찾으십시오. -타입 d -exec 터치 파일 {} \;
ChuckCottrill

1
또는find . -type d -exec touch {}/file\;
Ned64

6

빈 파일을 만들려면 touch및 셸 글로브를 사용할 수 있습니다 . zsh에서 :

touch **/*(/e:REPLY+=/file:)

bash에서 :

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

다행스럽게도 다음을 사용할 수 있습니다 find.

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

find전부는 아니지만 일부 구현을 사용하여 작성할 수 있습니다.find . -type d -exec touch {}/file \;

참조 내용을 복사하려면 find루프 를 호출해야합니다 . zsh에서 :

for d in **/*(/); do cp -p reference_file "$d/file"; done

bash에서 :

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

포터블 :

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +

2

touch현재 디렉토리와 모든 하위 디렉토리에서 $ name이라는 파일을 원할 경우 다음과 같이 작동합니다.

find . -type d -exec touch {}/"${name}"  \;

terdon의 답변에 대한 ChuckCottrill의 주석은 작동하지 않습니다 touch. 현재 디렉토리의 $ name 파일과 디렉토리 자체 만 작동하기 때문입니다 .

OP에서 요청한대로 하위 디렉토리에 파일을 작성하지는 않지만이 버전에서는 파일을 작성합니다.


0

실제로 단지 파일을 만들려면 사용할 수 있습니다 touch와 함께 find:

$ find . -type d -exec touch {}/file \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.