이름에 "오류" 또는 "트래픽"이 포함된 파일을 선택해야 합니다.
abc_ERRor.csv
raError.csv
bsn_Error.csv
bbbctraffic.csv
ccc_traffic.csv
...
Error_directory
traffic_directory
이름에 따라 해당 디렉터리로 이동합니다 .
시도했지만 성공하지 못했습니다.
mv $(ls test_file | grep -l 'Error>' *) Error_directory
명령줄에서 이 작업을 어떻게 수행합니까?
ls test_file | grep 'Error'
답변1
ls
파일 이름에 나타날 수 있는 문자가 다양하기 때문에 출력을 구문 분석하는 것은 좋은 생각이 아닙니다. 더 나은 해결책은 다음과 같습니다.
find ./test_file -iname "*error*" -print0 | xargs -0 -I {} mv {} Error_directory
-iname
이 옵션 에 주의하세요 . 그러면 대소문자를 구분하지 않는 일치 항목이 반환되어 파일을 찾고 이동할 수 있습니다. 예를 들면 다음과 같습니다.
abc_ERRor.csv
error_123.csv
ErRoR_77.csv
대소문자를 구분하지 않고 검색할 필요가 없다면 다음과 같이 간단한 것으로 충분합니다.
mv test_file/*Error* Error_directory
추가 자료:
답변2
또 다른 가능한 해결책은 다음과 같습니다.
#!/bin/sh
err_dir=~/errors
tra_dir=~/traffic
for f in *.csv; do
case $f in
*[Ee][Rr][Rr][Oo][Rr]*) mv -i $f $err_dir ;;
*[Tt][Rr][Aa][Ff][Ii][Cc]*) mv -i $f $tra_dir ;;
esac
done
답변3
다음을 사용하여 찾을 수 있습니다.
find test_file -type f -name "*Error*" -exec mv {} Error_directory/ \;
이는 -type f
파일을 찾고 있다는 의미이며, -name
주어진 패턴과 일치한다는 의미입니다. exec
다음 명령을 실행하고 {}
주어진 찾기 매개변수와 일치하는 파일을 바꾸십시오.
Bash를 사용하고 시도한 것과 더 유사한 작업을 수행하려면 루프를 사용하면 됩니다.
for f in `ls test_file | grep 'Error'; do
mv test_file/${f} Error_directory
done
두 예 모두에서 test_file은 관심 있는 파일이 포함된 디렉터리라고 가정합니다.
답변4
for fn in *.*; do for word in Error traffic; do echo "$fn" | grep -i "$word" && mkdir -p "$word"_directory && mv "$fn" "$word"_directory; done; done