폴더 이름이 "somestring"과 같으면 폴더의 모든 파일을 한 수준 위로 이동합니다.

폴더 이름이 "somestring"과 같으면 폴더의 모든 파일을 한 수준 위로 이동합니다.

오래된 백업 개념으로 인해 여기에는 다음과 같은 파일 구조를 가진 하드 드라이브가 있습니다.

/1.1
/2.1
/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/1.1
/FOLDER.DUPLICATE.$DRIVEBENDER/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/4.1
/Subfolder/1.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/2.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/3.2

결과는 원래 구조와 같아야 하므로 이름이 지정된 폴더의 모든 파일을 FOLDER.DUPLICATE.$DRIVEBENDER한 수준 위로 이동해야 합니다. 더 높은 수준의 파일이 있는 경우 더 큰 파일이 우선 적용됩니다.

답변1

FOLDER.DUPLICATE.$DRIVEBENDER다른 디렉터리에 디렉터리가 없다고 가정하면 FOLDER.DUPLICATE.$DRIVEBENDER다음을 수행할 수 있습니다.

find . -path '*/FOLDER.DUPLICATE.$DRIVEBENDER/*' -prune -type f -print0 |
  perl -0lne '
    if (m{(.*)/FOLDER.DUPLICATE.\$DRIVEBENDER/(.*)}s) {
      $upperfile = "$1/$2";
      if (-s > -s $upperfile) {
        rename $_, $upperfile or warn "rename $_: $!\n";
      } else {
        unlink $_ or warn "unlink $_: $!\n";
      }
    }'

( find지원하지 않는 경우 -print0로 대체할 수 있습니다 -exec printf '%s\0' {} +.)

관련 정보