아래와 같이 디렉토리에 일부 파일, 폴더 및 도트 파일이 있습니다.
|-folder1
|----folder2
|----file.json
|----file2.php
|----.env
|----.dockerfile
|----.someconfig
|----.dockerignore
제외 할 mv $(ls | egrep -v '(.dockerfile|.env)') ../new_directory
디렉터리의 모든 파일을 이동하는 명령을 실행했지만 실제로 는 모든 도트 파일을 이동할 수 없습니다. 이유는 무엇입니까?folder1
new_directory
.dockerfile
.env
답변1
당신이 달리면
ls | egrep -v '(.dockerfile|.env)'
그 자체로 여기서 무슨 일이 일어나고 있는지 이해하게 될 것입니다. 출력은 다음과 같습니다.
file2.php
file.json
folder2
이는 ls
기본적으로 도트 파일이 나열되지 않기 때문에 발생합니다. 도트 파일을 포함하고 .
또는 포함하지 않으려면 ..
다음을 사용하십시오 ls -A
.
$ ls -A | egrep -v '(.dockerfile|.env)'
.dockerignore
file2.php
file.json
folder2
.someconfig
ls
여기서는 사용할 필요가 없습니다 .당신은해야하지), Bash 확장을 사용할 수 있습니다패턴 매칭:
shopt -s extglob dotglob
mv !(.dockerfile|.env|.|..) ../new_directory
이는 모든 파일과 일치합니다.아니요.dockerfile
, 또는 으로 .env
명명 되었습니다 . 이 방법을 사용하면 공백, 줄 바꿈 등이 포함된 파일 이름에 문제가 발생하지 않습니다..
..
shopt -s extglob
확장된 패턴 일치를 활성화하고 shopt -s dotglob
글로벌 일치 도트 파일을 허용합니다.
답변2
이것을 사용해서는 안됩니다 ls
. 구문 분석 결과는 ls
가장 신뢰할 수 없으며 최악의 경우 위험합니다. 바라보다왜아니요구문 분석 ls
(및 수행 방법)?
시도 find
해봐. 예를 들어 GNU find
(및 GNU cp
)를 사용하는 경우:
find ./ -maxdepth 1 -regextype awk \
! -regex './(|\.env|\.dockerfile)' \
-exec echo cp -t ../new_directory/ {} +
-regextype awk
나는 awk의 정규식 방언에 매우 익숙하기 때문에 그것을 사용하고 있으며 find-default
. -regextype egrep
다음을 실행하여 사용 가능한 방언 목록을 얻을 수 있습니다 find -regextype help
(불행히도 PCRE는 그중 하나가 아닙니다).
제외하고, 그리고. -regex ...
앵커나 앵커는 모두 필요하지 않으며 암시적 의 술어이므로 정확히 일치하는 항목만 얻을 수 있습니다. 부분적으로 일치하려면 정규식의 시작 및/또는 끝에 추가해야 합니다. 그래서 정규식에 포함시켜야했습니다../
./env
./dockerfile
^
$
find
-regex
.*
./
상위 디렉토리에서 실행하려면 다음과 같이 작성해야 합니다.
find folder1/ -maxdepth 1 -regextype awk \
! -regex 'folder1/(|\.env|\.dockerfile)' \
-exec echo cp -t ../newfolder {} +
또는 경로 '.*/(|\.env|\.dockerfile)'
와 일치하는 다른 패턴을 사용하십시오.
이를 통해 echo
실제로 복사하지 않고 복사할 내용을 보여 주는 연습이 됩니다. 명령이 원하는 대로 작동한다고 확신하면 삭제하십시오.
GNU cp
의 -t
옵션을 사용하면 복사할 파일 목록 앞에 대상 디렉터리를 지정할 수 있습니다.