shell 脚本中的 mv 错误“是同一个文件”

shell 脚本中的 mv 错误“是同一个文件”

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

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

当我调试输出时,我看到了以下内容:

$ sudo bash -v videorename.sh 

date -r "$file" +"%Y-%m-%d %H %M %S"
mv: '/mnt/Files_Apps/temp/IMG_7662.MOV' and '/mnt/Files_Apps/TFTP root/2016-      05-08 11 57 58.MOV' are the same file
date -r "$file" +"%Y-%m-%d %H %M %S"
mv: '/mnt/Files_Apps/temp/IMG_7687.MOV' and '/mnt/Files_Apps/TFTP root/2016-    05-09 16 03 39.MOV' are the same file
date -r "$file" +"%Y-%m-%d %H %M %S"
date -r "$file" +"%Y-%m-%d %H %M %S"
date -r "$file" +"%Y-%m-%d %H %M %S"
date -r "$file" +"%Y-%m-%d %H %M %S"

src目录的详细信息:

ls -lia
total 148402
1443129 drwxrwxrwx  3 chris linuxadmin        0 Oct  9 18:12 .
26870564 drwxrwxrwx 15 chris linuxadmin        0 Oct  5 15:51 ..
1441900 -rwxrwxrwx  1 chris linuxadmin 75031725 May  8 11:57 IMG_7662.MOV
1443124 -rwxrwxrwx  1 chris linuxadmin 76930641 May  9 16:03 IMG_7687.MOV

我多次更改了源目录的内容。有些文件无法加载,但其他文件可以正常工作。我不明白为什么它会将某些文件(所有文件都是从我的 iPhone 导入的 MOV 格式)视为重复文件,尤其是当我将文件移动到新目录时。任何帮助都将不胜感激。

答案1

事实证明,问题出在 CIFS 共享的挂载方式上。似乎 inode 可能被缓存了,因此当脚本尝试写入新文件名时,大多数文件都会重复。为了解决这个问题,我在 fstab 中添加了“cache=none”并重新挂载了共享。此后,我多次运行了该脚本,没有出现任何问题。

虽然我知道问题是什么,但我仍然不完全确定为什么会出现问题。如果有人知道这会如何影响 CIFS 安装,我愿意倾听。

答案2

首先,永远不要使用 来调试你的脚本sudo

这个表达的意思"$dir"*.*和你想象的不一样。试试:

echo "$dir"*.*

要生成 中的文件列表$dir,请使用find(参见man find):

find "$dir" -type f -print

xargs它可以通过管道传输到你的脚本中,或者用( )分成参数man xargs

findxargssort以及一些其他程序)可以A file name.txt使用NUL (0x00)分隔符来处理带空格( )的文件名。遗憾的是,有多种命令行开关(-0-z--null)可供选择,要实现这一点,请参阅man页面。

相关内容