폴더안에 들어있는 데이터가 너무 많으면 ls 명령어 입력시에 리스팅을 다 하기 어렵기 때문에 Argument list too long 이라고만 말한다.
그래서 응용방법으로 ls *.jpg 이런식으로 조건검색을 해 볼 것이고, 이런 방법도 먹히지 않는다.
cp, mv 등등 모두 동작하지 않는다.
리눅스를 low-level 까지 잘 사용하진 못하지만 이런 방법이 있었다.
find 파일을_찾을_위치 -type f |grep 찾을파일형식 | awk ‘{print “cp -r “$1” ./}’ | bash
# example
find ./ -type f |grep *.jpg | awk '{print "cp -r "$1" ./}' | bash
example을 자세히 풀어보자.
find ./ -type f |grep *.jpg >> 이 명령어는 jpg 확장자의 파일 형태를 현재경로에서 찾는다는 명령어이다.
이 명령어만 입력하면 찾아낸 파일들을 쭉 리스팅 할 것이다.
이제 awk를 보자.
$1은 find ./ -type f |grep *.jpg 명령어를 치면 만약 이렇게 출력이 된다고 가정해보자.
123.jpg
124.jpg
125.jpg
그러면 $1은 첫 명령어에서는 123.jpg, 두 번째 명령어에서는 124.jpg ...가 된다.
예를 들어서,
'{print "cp -r "$1" ./}' 이렇게 입력했다고 하면
첫 번째 명령 수행은
cp -r 123.jpg ./
두 번째 명령 수행은
cp -r 124.jpg ./
이렇게 실행된다.
print는 awk의 "action"에 해당하는 동작으로 명령을 프린트해준다. https://recipes4dev.tistory.com/171
마지막으로 | bash는 bash로 실행하겠다는 뜻이다.
결론은
find ./ -type f |grep *.jpg | awk '{print "cp -r "$1" ./}' | bash
이런식으로 awk와 find를 응용하면 리스트가 너무 많을 때 하고 싶은 동작을 실행할 수 있다.