하위 폴더 트리에 다음 스크립트를 적용해야 하지만 트리의 각 하위 폴더에서 실행되도록 이 스크립트를 어떻게 호출해야 하는지 잘 모르겠습니다. 한 번만 하면 돼요. 미리 감사드립니다.
#!/bin/bash
for file in *.*
do
[[ -d "$file" || $file =~ _[[:digit:]]{3}\. ]] && continue
echo -n "Considering $file: " >&2
extn="${file/*.}"
versions=()
keep="$file"
# Look at matching files
for version in "${file%.$extn}"_???."$extn"
do
[[ -f "$version" ]] || continue
# Save every one. Identify the current last
versions+=($version)
keep="$version"
echo -n "$version " >&2
done
echo "==> keep $keep" >&2
# Delete them all except the last
for version in "${versions[@]}"
do
[[ "$version" != "$keep" ]] && echo rm -f "$version"
done
[[ "$keep" != "$file" ]] && echo mv "$keep" "$file"
done
답변1
myrename
이름이 이고 디렉토리에 있다고 가정하고 위의 스크립트에 이름을 지정합니다 $HOME
. 그런 다음 find에서 execdir을 사용하여 트리를 탐색합니다.
find /root/of/tree -depth -type d -execdir "$HOME/myrename" \{\} \;
myrename을 다음과 같이 사용해 보세요.
#!/bin/bash
echo "directory $1"
답변2
스크립트가 작동할 디렉터리에서 시작되어야 하는 경우 cd
먼저 해당 디렉터리로 이동해야 합니다. 이 같은:
find -type d -exec sh -c 'cd -- "$1"; exec /path/to/script.sh' sh {} \;
(물론 스크립트 경로를 변경하십시오.)
또는 스크립트를 수정하여 디렉터리 이름을 매개변수로 사용할 수 있습니다. 이는 cd
스크립트 시작 부분에 를 추가하는 것만큼 간단합니다.
#!/bin/bash
if [ "$1" ]; then
cd -- "$1" || exit 1
fi
for file in *.*
...
먼저 기본 동작이 현재 디렉터리에서 계속 작동하도록 비어 있는지 테스트합니다 $1
(그리고 인수 없이 실수로 호출되지 않습니다 cd
. 사용자의 로 이동합니다 $HOME
).
find -exec
그런 다음 디렉토리 이름을 스크립트에 대한 인수로 제공하는 간단한 명령을 실행하십시오 .
find -type d -exec /path/to/script.sh {} \;
답변3
다음 방법을 사용하여 테스트했는데 훌륭하게 작동합니다.
find path -depth -type d -exec sh /tmp/l.sh {} \;
/tmp/l.sh==> Its the script path