我正在尝试获取一个可以重命名和移动视频的脚本。以下是我所拥有的:
#!/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
。
find
和xargs
(sort
以及一些其他程序)可以A file name.txt
使用NUL
(0x00)
分隔符来处理带空格( )的文件名。遗憾的是,有多种命令行开关(-0
、-z
、--null
)可供选择,要实现这一点,请参阅man
页面。