다음과 같은 디렉토리가 있습니다.
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls
DFT-00001 DFT-00004 DFT-00007 DFT-00010 DFT-00013 DFT-00016 DFT-00019 DFT-00022 DFT-00025 DFT-00028 DFT-00031 DFT-00034
DFT-00002 DFT-00005 DFT-00008 DFT-00011 DFT-00014 DFT-00017 DFT-00020 DFT-00023 DFT-00026 DFT-00029 DFT-00032
DFT-00003 DFT-00006 DFT-00009 DFT-00012 DFT-00015 DFT-00018 DFT-00021 DFT-00024 DFT-00027 DFT-00030 DFT-00033
각 폴더 안에는 Li?Fe?O?_0이라는 파일이 있지만 그 중 일부는 겹칠 수 있습니다. 예를 들면 다음과 같습니다.
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00001/
Li1Fe5O6_0
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00002/
Li1Fe5O6_0
dhcp-18-189-47-44:CE-06-new-stuctures_backup wenxuanhuang$ ls DFT-00010/
Li2Fe4O6_0
이제 하위 폴더를 다른 디렉터리로 추출하고 싶습니다. 제가 시도한 첫 번째 시도는 다음과 같습니다.
find `pwd` -mindepth 1 -maxdepth 1 -type d -exec sh -c "echo {}; cd {}; ls; cp -r * /Users/wenxuanhuang/Desktop/software/CASM_NEW/LiFeO_from_Alex_2015_08_25/LiFeO2-CE/02-refinement/CE-06-new-stuctures_extracted" \;
그러나 일부는 이름 충돌로 인해 서로 겹칩니다. 내가 원하는 것은: 겹치는 경우: 충돌하지 않는 이름으로 바꾸고 복사하고 싶습니다...
이상적으로는 Li1Fe5O6_0이 이미 새 폴더에 있고 다른 Li1Fe5O6_0을 그 폴더에 복사하고 싶다고 가정하면 마지막 Li1Fe5O6_0 Li1Fe5O6_1의 이름을 지정하고 해당 Li1Fe5O6_1을 여기에 복사하고 싶습니다(향후에는 Li1Fe5O6_1 Li1Fe5O6_2 Li1Fe5O6_3 등이 있을 수 있습니다). 이 버전의 코드가 너무 번거롭다면. 그럼 상관없지...
답변1
이렇게 해야 합니다:
#!/bin/bash
# this is the crucial setting: replace a glob pattern that matches zero files
# with nothing (the default is to *not* replace the pattern at all)
shopt -s nullglob
destination=/some/directory
unique_filename() {
local root=${1%_*}_
local files=( "$destination/$root"* )
echo "$destination/${root}${#files}"
}
cd /wherever/you/need/to/go
for f in */Li?Fe?O?_0; do
echo mv "$f" "$(unique_filename "$(basename "$f")")"
done
이는 "Li1Fe5O6_*"와 같이 대상 디렉터리에서 일치하는 파일 수를 계산하여 작동합니다. 그렇지 않은 경우 "Li1Fe5O6_0"이 사용됩니다. "Li1Fe5O6_0"이 이미 존재하는 경우 $files
배열에는 하나의 요소가 있으므로 유일한 파일 이름은 "Li1Fe5O6_1"입니다.