파일을 검색한 다음 출력하는 스크립트를 작성했습니다. 명령을 사용하려고 할 때까지 스크립트가 작동합니다 du
. 코드는 다음과 같습니다
#!/bin/bash
echo "Enter either file name or format:"
read File
echo "Input the absolute path to directory:"
read Dir
echo "Enter \"/path/to/directory/filename\" to store outputs on the filename:"
read results
#cd $Dir;
#for dir in */; do
# echo $Dir;
#done | xargs -P0 -I_ echo "sudo find _ -type f -name \*$File\* " > temp.txt
cd $Dir;
for dir in */; do
echo $dir;
done | xargs -P0 -I_ sudo find _ -type f -name \*$File\* | du >> $results
기본적으로 입력 파일을 검색하려는 디렉토리를 검색하고 xargs
거기에 있는 코어를 최대한 활용합니다.
지금 필요한 것은 출력 파일의 크기와 results
출력할 파일뿐입니다. 직접 이 작업을 수행하면 포함된 모든 디렉터리에 잘못된 출력이 표시되고 검색한 파일을 찾을 수 없습니다. 어떤 아이디어가 있나요?
답변1
코드에 일부 오류가 있습니다.
cd $Dir
cd
실패할 수 있지만 스크립트는 계속 진행되므로(폴더 이름의 공백으로 인해 실패하므로) 스크립트에 사용하면 안 됩니다 . 성공 했는지 확인하는 것이 더 좋습니다 cd
. 두 가지 예는 다음과 같습니다.
cd "$Dir" || exit 2
cd "$Dir" && for dir in */; do
sudo
스크립트에서는 사용하면 안 됩니다. 올바른 권한으로 스크립트를 실행하는 것이 더 좋습니다(단지 의견)
sudo find _ -type f -name \*$File\*
find
루프가 필요한 경우 루프 안에 넣을 수 있습니다. 필요하지 않습니다 xargs
. (의견)
for dir in */; do echo $dir; done
for 루프는 별로 의미가 없지만(아무것도 없기 때문에) 사용할 수 있습니다 ls -d */
. 하위 폴더( 로 시작하는 숨겨진 폴더 제외 .
)만 인쇄하거나 find */
직접 인쇄할 수도 있습니다(더 좋음 cd "$Dir" && find ./*/
).
\*$File\* | du >> $results
문자열을 전달하지 마십시오 du
. 예상한 대로 작동하지 않습니다. 파일 이름을 인수로 사용하면 xargs
더 나은 방법으로 이를 수행 할 수 있습니다 -exec
( \;
각 파일을 개별적으로 처리하거나 +
모든 파일 이름을 한 번에 인수로 전달하려면).
for dir in */; find "$dir" -type f -iname "*$File*" -exec du {} + >> "$results"; done
그러나 find
하위 폴더 대신 상위 폴더에서 직접 실행할 수 있으며 파일 크기의 경우 (디스크 사용량을 정말로 원하지 않는 한) 다음과 같은 원하는 출력을 사용하는 것이 좋습니다."$dir"
"$Dir"
-mindepth 2
stat
stat -c %s$'\t'%n
find "$Dir" -mindepth 2 -type f -iname "*$File*" -exec stat -c %s$'\t'%n {} + >> "$results"
또는 xargs -0
너무 많은 매개변수가 전달된 경우stat
find "$Dir" -mindepth 2 -type f -iname "*$File*" -print0 | xargs -0 -P0 stat -c %s$'\t'%n >> "$results"
폴더 이름을 더 안전하게 처리하려면 읽기 동안 찾기 루프를 사용하여 결과를 NUL 종료하는 것이 좋습니다(GNU 확장 -print0
). 참조용으로 이 답변을 참조하세요( xargs -I_ find _
이미 작동하는 솔루션을 찾았지만).