일부 디렉터리를 "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/@'
이동할 파일마다 새 폴더가 생성된다는 점에 유의하세요.
결론은 다른 사람들이 더 나은 전문 도구를 사용하여 우리 삶을 더 쉽게 만드는 데 관심을 갖고 있지만 우리는 여전히 구식 파이프 쿼리에서 많은 것을 배울 수 있다는 것입니다. 적어도 내 경우에는 :)