폴더를 순환하고 파일을 다른 디렉터리로 이동해야 합니까? [폐쇄]

폴더를 순환하고 파일을 다른 디렉터리로 이동해야 합니까? [폐쇄]

하위 디렉터리에 여러 개의 파일이 있는데 이를 다른 디렉터리로 이동하고 싶습니다.

이러한 디렉토리는 다음과 같이 상위 디렉토리에 구성됩니다. Apr1995 Apr1996 Aug1995 등... (월 및 연도)

예를 들어 /파일/Apr1995입니다.

파일 형식은 다음과 같습니다: 1995___.info 또는 1995___.dat

각 하위 디렉터리로 이동하여 파일을 연도별로 구분된 다른 디렉터리로 이동한 다음 포맷하고 싶습니다. 이 같은:

OtherFiles/1995/info, OtherFiles/1995/dat, OtherFiles/1996/info 등

1995년 디렉터리에 info 및 dat라는 하위 디렉터리가 포함됩니다.

마지막으로 나는 다음 조직의 예를 원합니다.

데스크탑/파일/Apr1995/1995__.info,

데스크탑/파일/Apr1995/1995__.dat,

데스크탑/기타 파일/1995/정보,

데스크탑/기타파일/1995/dat 등

나는 몇 가지 단일 라이너와 같은 다양한 옵션을 시도했습니다.

 for d in ./*/ ; do (cd "$d" && mv 1995*.info /1995/info); done

또는

 find ./ -type f -execdir mv 1995*.info /1995/info {} \;

mv 오류가 발생하거나 유사한 파일임을 인식하지 못합니다.

쉘 스크립트도 도움이 될 수 있습니다.

나는 상대적으로 단순해 보이는 것에 약간 압도당했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

편집: 추가된 정보가 도움이 되기를 바랍니다.

답변1

두 번째 명령은 작동하지만 파일 이름을 지정하지 않았습니다. 1995_.info및/또는 패턴과 일치하는 모든 파일을 이동하려는 경우1995_.dat

find ./ -type f -name 1995*.info -exec mv {} /1995/info \;

find ./ -type f -name 1995*.dat -exec mv {} /1995/dat \;

하나의 명령으로 모든 연도에 대한 작업을 수행하려면 다음을 수행하십시오.

for y in {1995..1999}; do $(find Years -type f -name $y*.info -exec mv {} '/'$y'/info' \;); done

for y in {1995..1999}; do $(find Years -type f -name $y*.dat -exec mv {} '/'$y'/dat' \;); done

이것은 각 연도의 디렉토리를 반복하여 파일 이름을 찾아 각 연도의 디렉토리로 이동합니다.

참고 사항: CentOS 7.4에서 이것을 테스트하고 확인했지만 환경에 따라 *앞에 백슬래시를 추가할 수 있도록 이스케이프해야 할 수도 있습니다.\*

답변2

for a in `find ~+ -type f -path '*199[0-9]*' -iname '199[0-9]*.*'`
{
 if [[ $a =~ \.(dat|info)$ ]]
 then
  n=${a##*/}
  n=${n%.*}; x=${a##*.}
  d=RootNewDir/$n/$x
  mkdir -p $d
  mv $a $d/${n}__$x
 fi
}

관련 정보