#!/bin/sh
checking()
{
cd "$1"
for D in *;do
if [ -d "$D" ]; then
cd "$D"
for d in *;do
echo "$d"
if [ -d "$d" ]
then
`checking() $d`
fi
if [ -f "$d" ]
then
file_name=`echo "$d" | cut -d'.' -f1`
echo $file_name
file_ext=$(echo $d |awk -F . '{if (NF>1) {print $NF}}')
echo $file_ext
if [ $file_ext = bin ]
then
strings $d > $file_name.txt
mv $file_name.txt /somepath
fi
fi
done
cd ..
fi
done
}
a=$(pwd)
checking() $a
세션 로그 바이너리 파일을 텍스트 파일로 변환하고 문자열 기능을 사용하여 일부 경로에 저장하고 있습니다. 모든 디렉토리에 대해 잘 수행되지만 존재하는 하위 디렉토리에 대한 바이너리 파일을 확인하지 않습니다.
재귀 함수 호출을 사용해 보았으나 해당 호출이 실행되지 않습니다. 도와주세요.
답변1
귀하의 기능에서 몇 가지 사항을 확인했습니다.
- 디렉토리로 변경한 다음 파일을 반복하고 두 가지를 모두 수행합니다.다시(
cd; for d in *; do cd; for d in * ...
). 이는 재귀 탐색 중에 디렉터리 트리의 다른 모든 수준을 건너뛰는 것처럼 보입니다. 파일을 한 번만 반복하면 충분합니다. - 함수를 재귀적으로 호출할 때 하위 쉘을 사용할 필요가 없다고 생각합니다( 에 백틱 명령 대체가 있습니다
`checking() $d`
). 이는 함수 호출의 각 인스턴스에 로컬 변수가 필요한 경우 유용할 수 있지만 많은 쉘에서는 이를 직접 수행할 수 있습니다(local
Bash에서 사용,분명히typeset
ksh93에서) - 그리고 물론 함수를 호출하는 구문은 다음
hi() { echo "hello $1"; }
과 같습니다. 다른 명령처럼 간단히hi "$name"
. - 우리는 nix를 사용
awk
하고 쉘을 사용할 수 있습니다매개변수 확장파일 확장자를 선택합니다. (단, 파일 이름에 점이 없는 경우 경계선 대소문자를 확인하십시오.) 또는 다음을 사용하십시오.case "$f" in *.bin) ...
다음은 디렉토리 트리를 탐색하는 간단한 함수입니다.
#!/bin/sh
walk() {
cd "$1"
for f in *; do
if [ -d "$f" ] ; then
echo descending into "$f"...
walk "$f"
else
ext=${f##*.}
if [ "$ext" = "bin" ] ; then
echo "found .bin file: $f"
fi
fi
done
cd ..
}
walk .
(그러나 cd "$dir"; ... ; cd ..
프로그램이 해당 디렉토리를 처리하는 순간 누군가 디렉토리를 이동하면 구조가 문제를 일으킬 수 있다는 점에 유의하십시오. 링크는 ..
변경되고 이를 통해 돌아오는 것은 원래 트리 외부에 있을 수도 있는 새 위치에서 계속됩니다. 항상 절대 경로 이름을 사용하거나 pushd/popd
(Bash에서) 사용하거나, 전체 함수나 호출을 하위 쉘에 넣어서 이 문제를 해결할 수 있습니다.)