스크립트에서 작동하지 않는 xargs를 사용하여 찾기 및 복사

스크립트에서 작동하지 않는 xargs를 사용하여 찾기 및 복사

거대한 디렉토리에서 세 개의 파일을 찾아 다른 디렉토리에 복사해야 합니다.

이것이 내가 한 일입니다:

find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir

파일은 a1대상 위치에 복사되지만 다른 파일은 대상 위치에 복사되지 않습니다. 이것은 내 스크립트입니다.

#!/bin/bash
date=$(date)
day=$(date +"%u")
adir=/x/y
bdir=/a/b
 {
      if [ "$day" == "5" ] ; then
         find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir
       else
           echo "failed"
       fi
    }

스크립트에서 실행했는데 커서가 터미널로 반환되지 않습니다. 작동하게 하는 방법이 있나요?

답변1

괄호를 제거해 보세요. 이 명령은 터미널과 bash 쉘에서 직접 작동했습니다(작동하는지 확인하려면 cp를 "file"로 변경하세요..).

 find . -type f -name "a4*" -o -name "d1*" -o -name "f2*" -mtime -8 | xargs file

또한 작업을 수행할 수 있는 더 많은 공간(루프)을 제공할 수 있는 for 루프를 시도해 볼 수도 있습니다. find행 변경

for a_file in `find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8`
do
   cp -t $a_file $bdir
done

삭제 -mtime -8하고 변경하여 cp -t $a $bdir테스트 할 수 있습니다 echo "The file is: " $a_file.

답변2

논의한 대로 스크립트는 구문론적으로나 구문론적으로 정확해 보이므로 스크립트 자체 외부에 스크립트가 그런 방식으로 작동하도록 하는 무언가가 있어야 합니다.

그렇게 말하면서 대본에 대해 내 의견을 알려줄 수 있습니다. 이에 상응하는 내용을 작성하는 방법은 다음과 같습니다.

#!/bin/sh

day=$(date +'%u')
adir='/x/y'
bdir='/a/b'

case "$day" in
    5)  find "$adir" -type f -mtime -8 -name 'a[123]*' -exec cp {} "$bdir"/ ';'
        ;;
    *)  printf 'Error: Unhandled day "%s"\n' "$day" >&2
        exit 1
esac

이는 일치시키려는 다양한 이름이 단일 파일 이름 와일드카드 패턴으로 일치될 수 있다는 사실을 활용합니다. 또한 GNU cp및 해당 옵션에 의존 -t(제거 ) 하지 않습니다 xargs. 그리고 "bashism"을 전혀 사용하지 않기 때문에 유래로도 설명할 수 있습니다 /bin/sh.

case ... esac무리 보다 if ... then ... elif.

관련 정보