2016-11-14 7 views
4

저는 Linux에 대해 더 많이 배우려고 노력했으며 오늘 아침 awk 명령에 중점을 두었습니다. 내가 일하려고하는 명령은 아래에있다.AWK 출력을 사용하는 Linux CP

ls -lRt lpftp.* | awk '{print $7, $9}' | mkdir -p $(awk '{print $1}') | ls -lRt lpftp.* | cp $(awk '{print $9, $7}') 

기본적으로 디렉토리의 각 파일을 마지막으로 수정 한 파일을 기반으로 하위 디렉토리로 옮깁니다. 이 명령은 먼저 원하는 파일 만 인쇄 한 다음 mkdir을 사용하여 마지막으로 수정 한 날짜를 기준으로 폴더를 만듭니다. 내가 그 후하고 싶은 명령이는 01 폴더에있는 모든 파일을 이동 지금 그러나 같은 관련 디렉토리에 각 파일을 이동하고 모든 디렉토리에 대해 한 번 다음 텍스트

cp: 0653-436 12 is a directory. 
    Specify -r or -R to copy. 

을 출력합니다.

누구든지 내가이 문제를 해결할 수있는 방법을 알고 있습니까? 또는 그것에 대해 갈 수있는 더 좋은 방법이 있다면? dodone 사이

+0

왜'mkdir'의 출력을'ls'로 파이핑합니까? 'mkdir'는 (에러 메세지를 제외하고) 출력을 생성하지 않으며'ls'는 입력을 사용하지 않습니다. – Barmar

+0

두 번째 LS 문의 이유는 mkdir 이후에 원래 LS의 파일 이름에 액세스 할 수 없기 때문에 다시 실행하여 해당 목록을 다시 만들었 기 때문입니다. 거기에 더 좋은 방법이 있습니까? – Cronisej

+0

@ 크로니 세이 예, 제 답변을 참조하십시오. – eddiem

답변

3

ls -lRt lpftp.* | awk '{print $7, $9}' | while read day file ; do mkdir -p "$day"; cp "$file" "$day"; done

명령은 day 변수 (행당) file에서 두번째의 제 것으로, 각 출력 라인 awk 인쇄를 실행한다. 여기서는 따옴표를 다소 불필요하게 사용했습니다. 변수가 설정되는 방법에 따라 변수에 공백이 없기 때문입니다.

1

이런 식으로 - 가장 빠른 실행을하는 가장 안전한 방법은 데이터에 awk를 사용하여 쉘 스크립트를 출력하는 것입니다. awk에서 실행하려고하는 mkdircp 명령을 인쇄하십시오. 만족할 때까지 머리 (1)으로 결과를 파이프하십시오. 어쩌면 전체를 보다 덜 (1)으로 보아라. 그런 다음 다음과 같이 실행하십시오.

ls -lRg lpfpt.* | awk script.awk | sh -ex 

이렇게하면 명령이 표준 오류로 반향되고 첫 번째 오류가 발생하면 중지됩니다. 그것이 옳다는 것을 절대적으로 확신한다면, x 옵션을 놓아 라.

루프 또는합니다 (system 기능) AWK의 서브 프로세스의 무리를 통해이 방법의 장점은 다음과 같습니다

  • 당신은 무슨 일이 일어날 볼 수 있고, 실행
  • 속도를 무슨 일이야