내가 지정한 파일에 대한 정보를 반환하는 "파일"의 결과를 사용하려고합니다.
예
file *.doc 'all .doc extensions
그러면 "Name of Creation Application : Microsoft Word"를 포함한 파일에 대한 정보가 반환됩니다. 이제 "Word"문자열에 대한 결과를 검색하려고합니다. 나는 여기에 갇혀있다. 실제로 어떻게합니까?
* 이것은 몇 시간의 검색 후에 시도한 것입니다. 내가 찾는 단어가 무엇인지 모르겠습니다. 조언하십시오.
find . -type f -print0 | xargs -0 grep -lh "Microsoft Word" | xargs -I % mv % ../NewDirectory/
파일 자체에서 "Word"문자열을 검색하여 새 디렉토리로 이동한다고 생각합니다.
내가 올바르게 이해했다면 현재 디렉터리와 하위 디렉터리에서 다른 디렉터리로 재귀 적으로 파일을 이동하려고합니다. 그러나 file
명령이 "Microsoft Word"파일로보고하는 경우에만 해당됩니다 . 즉, file "$filename" | grep 'Microsoft Word'
일부 출력 을 생성 하는 파일에 관심이 있습니다 .
쉬운 방법은 차분하게 물건을 파일별로 가져가는 것입니다. 현재 디렉토리에있는 파일 만 원하는 경우 for
루프와 와일드 카드 패턴을 사용할 수 있습니다 .
for f in *.doc; do
if …
done
조건은 무엇입니까? Microsoft Word
의 출력에 나타나는지 테스트하고 싶습니다 file "$f"
. file --
이름이로 시작하는 파일로부터 보호하기 위해 사용 합니다 -
.
for f in *.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
…
fi
done
파일을 이동하는 명령을 추가하기 만하면됩니다.
for f in *.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
mv -- "$f" ../NewDirectory/
fi
done
하위 디렉토리에서도 파일을 찾으려면 재귀 globbing에 **
wilcdard 패턴 을 사용하십시오 . bash에서는 활성화해야합니다 shopt -s globstar
(ksh93에서는, set -o globstar
zsh에서는 즉시 작동합니다. 다른 쉘에는이 기능이 없습니다). bash ≤4.2는 디렉토리에 대한 심볼릭 링크를 따릅니다.
for f in **/*.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
mv -- "$f" ../NewDirectory/
fi
done
이동 된 모든 파일은로 끝나고 ../NewDirectory/
하위 디렉토리가 생성되지 않습니다. 디렉토리 트리를 재현하려는 경우 문자열 조작 구문 을 사용하여 파일 이름의 디렉토리 부분을 추출하고 mkdir -p
필요한 경우 대상 디렉토리를 만들 수 있습니다.
for f in ./**/*.doc; do
if file "$f" | grep -s 'Microsoft Word'; then
d="${f%/*}"
mkdir -p ../NewDirectory/"$d"
mv "$f" ../NewDirectory/"$d"
fi
done
file
다소 취약한 의 출력을 구문 분석하는 대신 file -i
표준화 된 문자열을 인쇄 하는 구문 분석을 선호 할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다