我对bash比较陌生。我想知道Mac OS终端上是否存在现有命令,可以按月在新目录中分离视频文件。从本质上讲,这意味着如果我在12个月的时间内拥有视频,我将在其中放置12个新目录,其中包含视频。
否则,我想知道是否还有另一种方法可以通过python解决此问题。
我希望使用它来处理500多个视频文件。如果我可以有一个脚本为我自己做,而不是一个一个地遍历它们,那将对我有极大帮助。
脚本之前
脚本后(所需的输出)
更新(找到解决方案)
我最终找到了解决方案,谢谢您为我提供了正确的答案。现在我今天学到了一件事
import os, shutil
from datetime import datetime
filepath = "/Users/alfietorres/Downloads/" #base file path
for filename in os.listdir(filepath): #iterate through each file in the directory
r = os.stat(filepath+filename) #look for the file path and the file name
d = r.st_birthtime #look for the time created
date=datetime.fromtimestamp(d) #assign the details to a date variable
month_directory = filepath+str(date.month)+"-"+str(date.year) #use the date variable to create a UNIQUE new directory
file_being_moved = filepath+filename #file the path of the file being moved
if os.path.isdir(month_directory) : #check if the directory is created
print("directory found ... ")
shutil.move(file_being_moved,month_directory) #move the file we are iterating on to the directory
else:
print("creating directory ... ")
os.mkdir(month_directory) #create new directory
shutil.move(file_being_moved,month_directory) #move items in new directory
答案 0 :(得分:1)
您可以编写一个为您执行此操作的python脚本。
使用os
模块获取有关文件的信息。特别是创建时间:
import os
r = os.stat("path/to/file")
print(r.st_ctime_ns) # it prints the number of nano seconds since creation (Windows OS)
为了获取目录中文件/目录的列表,您也可以使用os
模块:
os.listdir("path/to/directory/") # you get a list of all files/directories
为了将时间戳转换为日期时间,可以使用datetime
模块:
from datetime import datetime
d = r.st_ctime_ns // 1000000 # convert to seconds
date = datetime.fromtimestamp(d)
print(date) ## datetime.datetime(2019, 3, 19, 5, 37, 22)
print(date.year) ## get the year
print(date.month) ## get the month
print(date.day) ## get the day
现在,您只需组合这些信息即可整理文件。
os.mkdir("directory name")
os.rename("old path", "new path")
答案 1 :(得分:0)
按月在新目录中分离视频文件
来自info date
‘-r FILE’
‘--reference=FILE’
Display the date and time of the last modification of FILE, instead
of the current date and time.
所以要从文件的最后修改时间获取月份。
date -r file '+%m'
使用bash
和find
。
#!/usr/bin/env bash
dirs=("$@")
find "${dirs[@]}" -type f -print0 | {
while IFS= read -rd '' file; do
file_name=${file##*/}
path_name=${file%"$file_name"}
directory=$(date -r "$file" "+%m")
if ! [[ -e "${path_name}month$directory" && -d "${path_name}month$directory" ]]; then
echo mkdir -p "${path_name}month$directory" && echo mv -v "$file" "${path_name}month$directory"
else
echo mv -v "$file" "${path_name}month$directory"
fi
done
}
要使用脚本,请假定脚本名称为myscript
,而folder_name
是所讨论目录的名称。
./myscript folder_name
或具有多个文件夹/目录
./myscript folder1 folder2 folder3 folder4 another_folder /path/to/folder
-type f
查找文件而不是目录。
如果对输出满意,请删除所有echo
,然后将所有mv
更改为cp
,只是为了复制文件而不是完全移动文件。