grep 이후 디렉토리 이동

grep 이후 디렉토리 이동

일부 디렉터리를 "build_tools" 폴더로 이동하기 위해 다음 명령을 실행했지만 결과는 내가 예상한 것과 다릅니다.

ls -l | grep 2014-03 | awk '{if ($8!=build_tools) print $8}' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/

"build_tools" 폴더를 나머지 디렉터리와 함께 awk(zlib)에서 생성된 폴더 중 하나로 이동한 후 다음 메시지가 표시됩니다.

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe

누군가 내 실수가 무엇인지 밝혀 줄 수 있습니까?

편집 1:

ls -l의 출력은 다음을 제공합니다.

drwxr-xr-x  3 poissonbreaker poissonbreaker     4096 2011-05-02 09:58 antlr3.2
-rw-r--r--  1 poissonbreaker poissonbreaker   318588 2011-05-17 16:21 AppFramework-1.03.jar
-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
drwxr-xr-x  4 poissonbreaker poissonbreaker     4096 2013-01-11 23:13 clutter-sharp
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

날짜 필드($6)가 2014-03과 일치하는 파일을 가져오고 싶기 때문에 다음과 같이 간단한 grep을 수행합니다(디렉토리에 이 패턴의 파일 이름이 있는 파일이 없습니다).

ls -l  | grep 2014-03 

결과는 다음과 같습니다.

-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

그런 다음 awk를 통해 모든 파일의 파일 이름 필드($8)를 가져와 최종적으로 build_tools 폴더로 이동했습니다. (이 시점에서 내 실수가 무엇인지 알았습니다. build_tools 폴더도 이 날짜에 생성되었습니다. S). 하지만 일부 내용이 누구에게나 유용할 경우를 대비하여 이 질문을 여기에 남겨 두겠습니다.

편집 2: awk 표현식을 다음과 같이 변경했습니다.

awk '{if ($8!=build_tools) print $8}'

그것이 이해가 되려면.

답변1

나는 당신이 GNU 를 가지고 있다고 가정합니다 find. 특정 기간(예: 2014년 3월) 내에 수정된 파일이나 디렉터리를 이동하려면 다음을 수행하십시오.

find . -maxdepth 1 \
-newermt 2014-02-28 -not -newermt 2014-04-01 \
-not -name 'build_tools' \
-exec mv {} build_tools \+

설명:

  • 하위 디렉토리 없이 이 디렉토리에서 찾으세요.
  • 2월 28일부터 4월 1일 사이의 파일입니다. 여기서는 mt수정 시간을 의미합니다. ct생성 시간을 검색하는 데 사용할 수도 있습니다 .
  • 이름이 지정되지 않은 것build_tools
  • 모두 로 이동하세요 build_tools. 이는 발견된 모든 파일/디렉토리 이름이 한 번에 하나씩이 아니라 에서 \+대체된다는 의미입니다 . {}한 번에 하나씩 원한다면 \;대신 필요합니다.

몇 가지 사항:

  • 출력을 구문 분석하지 마십시오ls. 형식은 운영 체제에 따라 다르며 awk파일/디렉터리 이름에 공백이 포함된 경우 열 선택이 실패합니다.

  • &이전에는 명령을 연결했지만 프로세스 &를 백그라운드에 배치했을 뿐입니다. 만약 있었다면 를 사용해야 했지만 &&전체적으로 원하는 것을 달성하는 것은 다소 복잡할 것입니다.

답변2

내 솔루션의 올바른 버전에서는 여러 명령을 처리하기 위해 xargs가 필요합니다. 이는 명령을 다음으로 래핑하여 얻을 수 있습니다.

sh -c (or bash -c) 'Command1; Command2; .. Comandn'

따라서 올바른 해결책은 다음과 같습니다.

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ {print $8}' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@'

이동할 파일마다 새 폴더가 생성된다는 점에 유의하세요.

결론은 다른 사람들이 더 나은 전문 도구를 사용하여 우리 삶을 더 쉽게 만드는 데 관심을 갖고 있지만 우리는 여전히 구식 파이프 쿼리에서 많은 것을 배울 수 있다는 것입니다. 적어도 내 경우에는 :)

관련 정보