我正在尝试获取一个可以重命名和移动视频的脚本。以下是我所拥有的:
#!/bin/bash
src="/mnt/Files_Apps/temp/"
dest="/mnt/Files_Apps/TFTP root/"
for file in "$src"*.*; do
newfile="${dest}$(date -r "$file" +"%Y-%m-%d %H %M %S").MOV"
mv "$file" "$newfile"
done
我多次更改了源目录的内容。有些文件无法加载,其他文件则运行正常。我不明白为什么它会将某些文件(全部为 .MOV 格式,从我的 iPhone 导入)视为重复文件。
输出mount
:
//GRAMNAS/Files_Apps on /mnt/Files_Apps type cifs (rw,relatime,vers=1.0,sec=ntlm,cache=strict,username=xxxxx,uid=1208001104,forceuid,gid=1208001114,forcegid,addr=x.x.x.x,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,actimeo=1)
脚本运行之前在 src 上执行 ls -li:
~/.scripts$ ls -li /mnt/Files_Apps/temp/
total 697384
13238340 -rwxrwxrwx 1 chris linuxadmin 8844047 Jul 19 21:39 IMG_5624.MOV
13238349 -rwxrwxrwx 1 chris linuxadmin 96701684 Apr 14 11:58 IMG_7355.MOV
13238366 -rwxrwxrwx 1 chris linuxadmin 98690685 Apr 17 15:06 IMG_7426.MOV
13238384 -rwxrwxrwx 1 chris linuxadmin 100289499 May 5 14:32 IMG_7568.MOV
13238579 -rwxrwxrwx 1 chris linuxadmin 75031725 May 8 11:57 IMG_7662.MOV
13239032 -rwxrwxrwx 1 chris linuxadmin 86233885 May 9 10:13 IMG_7672.MOV
13239098 -rwxrwxrwx 1 chris linuxadmin 76930641 May 9 16:03 IMG_7687.MOV
13239466 -rwxrwxrwx 1 chris linuxadmin 78796811 May 13 13:22 IMG_7806.MOV
13240809 -rwxrwxrwx 1 chris linuxadmin 92599209 May 14 12:39 IMG_7951.MOV
脚本运行之前在目标上执行 ls -li:
~/.scripts$ ls -li /mnt/Files_Apps/TFTP\ root/
total 0
脚本输出:
~/.scripts$ bash -v videorename.sh
date -r "$file" +"%Y-%m-%d %H %M %S"
mv: '/mnt/Files_Apps/temp/IMG_5624.MOV' and '/mnt/Files_Apps/TFTP root/2016-07-19 21 39 21.MOV' are the same file
date -r "$file" +"%Y-%m-%d %H %M %S"
mv: '/mnt/Files_Apps/temp/IMG_7355.MOV' and '/mnt/Files_Apps/TFTP root/2016-04-14 11 58 26.MOV' are the same file
date -r "$file" +"%Y-%m-%d %H %M %S"
mv: '/mnt/Files_Apps/temp/IMG_7426.MOV' and '/mnt/Files_Apps/TFTP root/2016-04-17 15 06 35.MOV' are the same file
date -r "$file" +"%Y-%m-%d %H %M %S"
.
.
.
脚本运行后在 src 上执行 ls -li:
~/.scripts$ ls -li /mnt/Files_Apps/temp/
total 697384
13238340 -rwxrwxrwx 1 chris linuxadmin 8844047 Jul 19 21:39 IMG_5624.MOV
13238349 -rwxrwxrwx 1 chris linuxadmin 96701684 Apr 14 11:58 IMG_7355.MOV
13238366 -rwxrwxrwx 1 chris linuxadmin 98690685 Apr 17 15:06 IMG_7426.MOV
13238384 -rwxrwxrwx 1 chris linuxadmin 100289499 May 5 14:32 IMG_7568.MOV
13238579 -rwxrwxrwx 1 chris linuxadmin 75031725 May 8 11:57 IMG_7662.MOV
13239032 -rwxrwxrwx 1 chris linuxadmin 86233885 May 9 10:13 IMG_7672.MOV
13239098 -rwxrwxrwx 1 chris linuxadmin 76930641 May 9 16:03 IMG_7687.MOV
13239466 -rwxrwxrwx 1 chris linuxadmin 78796811 May 13 13:22 IMG_7806.MOV
13240809 -rwxrwxrwx 1 chris linuxadmin 92599209 May 14 12:39 IMG_7951.MOV
脚本运行后在目标上执行 ls -li:
~/.scripts$ ls -li /mnt/Files_Apps/TFTP\ root/
total 0
答案1
事实证明,问题出在 CIFS 共享的挂载方式上。似乎 inode 可能被缓存了,因此当脚本尝试写入新文件名时,大多数文件都会重复。为了解决这个问题,我在 fstab 中添加了“cache=none”并重新挂载了共享。此后,我多次运行了该脚本,没有出现任何问题。
虽然我知道问题是什么,但我仍然不完全确定为什么会出现问题。如果有人知道这会如何影响 CIFS 安装,我愿意倾听。
答案2
对于 mv 对“同一个文件”的抱怨,请尝试使用mv -n
(--no-clobber):不要覆盖现有文件:
mv -n "$file" "$newfile"
但是,“mv -n”在旧版 GNU 中可能无法正常工作:
$ mv -n ./my_file /current_dir/my_file
mv: './my_file' and '/current_dir/my_file' are the same file
要解决此问题,请在移动之前使用 检查文件是否具有相同的设备和 inode 编号-ef
:
$ [[ ./my_file -ef /current_dir/my_file ]] || mv ./my_file /current_dir/my_file
答案3
处理空格并不是那么麻烦:
#!/bin/bash
src="/mnt/Files_Apps/temp/"
dest="/mnt/Files_Apps/TFTP root/"
for file in "$src"*.*; do
newfile="${dest}$(date -r "$file" +"%Y-%m-%d %H %M %S").MOV"
mv "$file" "$newfile"
done
告诉我它是否解决了你的问题。至少它更简单。