"dir"이라는 재귀 디렉터리가 있습니다. 터미널의 Linux에서 다음 명령을 사용하여 모든 하위 디렉터리의 파일 목록을 CSV 파일에 쓰고 있습니다.
dir$ find . -type f -printf '%f\n' > old_names.csv
파일 이름을 변경하기 위해 해독 코드를 사용하고 있습니다. 다음을 사용하여 새 목록을 만들고 있습니다.
dir $ find . -type f -printf '%f\n' > new_names.csv
이를 목록에 결합하고 아래와 같이 두 개의 열이 있는 새 목록을 만들고 싶습니다.
이를 위해 두 개의 csv 파일을 pandas 데이터 프레임으로 읽고 python3 스크립트에서 아래와 같이 인덱스에 결합했습니다.
import pandas as pd
import csv
df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
df_names=df_new.join(df_old)
문제는 Wrong file pair;라는 메시지가 표시된다는 것입니다.
new_names.csv를 열었을 때 파일 목록이 old_names 목록과 다른 순서로 작성되어 인덱스를 조인하면 잘못된 쌍이 발생하는 것을 발견했습니다. 이 문제를 어떻게 해결할 수 있나요?
답변1
이 find
명령은 정렬이나 처리 없이 단순히 파일 시스템에서 지정한 순서대로 디렉토리 항목을 출력합니다. 사용 중인 파일 시스템 및 기타 요인에 따라 단일 파일의 이름을 바꾸더라도 반복 순서가 변경될 수 있지만 모든 파일을 변경하면 그럴 가능성이 높습니다. 엄격하게 통제된 환경이 없다면 두 개의 find
s가 동일한 명령을 내려야 할 특별한 이유가 없습니다 .
예를 들어, 많은 최신 파일 시스템은 이름을 다음 위치에 저장합니다.해시 테이블, 항목이 나타나는 순서대로 반복합니다. 작은 파일 이름 변경 사항은 원래 파일 이름보다 테이블에서 훨씬 앞이나 뒤에 나타날 수 있으며 전체 디렉터리가 다시 해시되어모든 것이동하다. 이 경우 조각을 다시 합칠 수 있는 현실적인 방법은 없습니다.
그것은가능한각 파일 이름에 변경되지 않은 고유 접두사가 있는 경우sort
파일 이름을 조작하는 것이 도움이 될 수 있지만 이것이 두 번의 실행에서 두 개의 개별 파일을 계속 사용하여 수행할 수 있는 유일한 현실적인 후처리입니다 find
. 나는 이것을 시도하는 것을 권장하지 않습니다.
그러나 변경 사항을 인쇄할 수 있는 옵션이 detox
있습니다 (및 변경 사항을 인쇄할 수 있음).-v
-n
회의하다). 이를 사용하여 CSV 파일을 생성하거나 다음에서 직접 사용할 수 있습니다.파이썬 사용법subprocess.run
.
detox -v ... | sed -e 's/ -> /,/' > names.csv
하나 이상의 파일과 동일한 CSV 파일이 생성되며 find
이전 이름과 새 이름이 자동으로 일치합니다. (이전과 마찬가지로) 기본 이름의 경우 %f
사후 처리를 수행해야 하며, 필요한 경우 Python이나 셸에서 수행할 수 있습니다.