mv 命令报告“X 和 Y 是同一个文件”,cifs 文件系统

mv 命令报告“X 和 Y 是同一个文件”,cifs 文件系统

我正在尝试获取一个可以重命名和移动视频的脚本。以下是我所拥有的:

#!/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

告诉我它是否解决了你的问题。至少它更简单。

相关内容