루트 디렉터리의 도트 파일을 이동할 수 없는 이유는 무엇입니까?

루트 디렉터리의 도트 파일을 이동할 수 없는 이유는 무엇입니까?

아래와 같이 디렉토리에 일부 파일, 폴더 및 도트 파일이 있습니다.

|-folder1
|----folder2
|----file.json
|----file2.php
|----.env
|----.dockerfile
|----.someconfig
|----.dockerignore

제외 할 mv $(ls | egrep -v '(.dockerfile|.env)') ../new_directory디렉터리의 모든 파일을 이동하는 명령을 실행했지만 실제로 는 모든 도트 파일을 이동할 수 없습니다. 이유는 무엇입니까?folder1new_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옵션을 사용하면 복사할 파일 목록 앞에 대상 디렉터리를 지정할 수 있습니다.

관련 정보