#!/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"
. - 취소
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에서) 사용하거나 전체 함수를 배치하거나 하위 쉘에서 호출하여 항상 절대 경로 이름을 사용하여 이 문제를 해결하십시오 .