【问题标题】:BASH Script to move files is not moving files correctly用于移动文件的 BASH 脚本未正确移动文件
【发布时间】:2019-05-20 16:50:31
【问题描述】:

我编写了一个脚本,根据文件名的第一个字母将文件从 _Incoming 目录移动到 ../[A-Z] 目录。

它似乎无法正常工作,因为此目录中的所有剩余文件都被移动到默认的“../@”目录中。

这是我正在使用的脚本:

#!/bin/bash
echo "+-------------------------------------------------------------------+"
echo "|               Removing _ and replacing with space                 |"
echo "+-------------------------------------------------------------------+"
find /run/media/chad/New\ Volume/Chad/_Incoming/ -depth -name '*_*' |
while IFS= read -r f ; do
    mv -iv "$f" "$(dirname "$f")/$(basename "$f"|tr '_' ' ')" ;
done
### Would be nice if this didn't rename the Incoming directory.
### But, since it does...
echo "+-------------------------------------------------------------------+"
echo "| Trying to rename ' Incoming' back to '_Incoming' -- Failure=OKAY  |"
echo "+-------------------------------------------------------------------+"
mv -v /run/media/chad/New\ Volume/Chad/\ Incoming \
      /run/media/chad/New\ Volume/Chad/_Incoming

echo "+-------------------------------------------------------------------+"
echo "|              Sorting and Moving Files based on Alpha              |"
echo "+-------------------------------------------------------------------+"
for i in /run/media/chad/New\ Volume/Chad/_Incoming/\*; do 
    echo "i:$i"
    FILE=$(basename "$i")
    echo "FILE:$FILE"
    LTR=$(echo "${FILE:0:1}" | tr [:lower:] [:upper:] )
    echo "LTR:$LTR"
    NEWFILE="/run/media/chad/New Volume/Chad/$LTR/$FILE"
    echo "NEWFILE:$NEWFILE"
    mv -v "$i" "${NEWFILE//_/ }"
done

echo "+-------------------------------------------------------------------+"
echo "|             Moving the left-overs to the '@' directory            |"
echo "+-------------------------------------------------------------------+"
mv -v /run/media/chad/New\ Volume/Chad/_Incoming/* /run/media/chad/New\ Volume/Chad/@

这是我要移动几个文件时的输出:

+-------------------------------------------------------------------+
|               Removing _ and replacing with space                 |
+-------------------------------------------------------------------+
renamed '/run/media/chad/New Volume/Chad/_Incoming/' -> '/run/media/chad/New Volume/Chad/ Incoming'
+-------------------------------------------------------------------+
| Trying to rename ' Incoming' back to '_Incoming' -- Failure=OKAY  |
+-------------------------------------------------------------------+
renamed '/run/media/chad/New Volume/Chad/ Incoming' -> '/run/media/chad/New Volume/Chad/_Incoming'
+-------------------------------------------------------------------+
|              Sorting and Moving Files based on Alpha              |
+-------------------------------------------------------------------+
i:/run/media/chad/New Volume/Chad/_Incoming/*
FILE:*
LTR:*
NEWFILE:/run/media/chad/New Volume/Chad/*/*
+-------------------------------------------------------------------+
|             Moving the left-overs to the '@' directory            |
+-------------------------------------------------------------------+
renamed '/run/media/chad/New Volume/Chad/_Incoming/Deep-fried Sea Bream - Mukbang eating show.mp4' -> '/run/media/chad/New Volume/Chad/@/Deep-fried Sea Bream - Mukbang eating show.mp4'
renamed '/run/media/chad/New Volume/Chad/_Incoming/HOW TO BUILD A PLANT SUPPORT.mp4' -> '/run/media/chad/New Volume/Chad/@/HOW TO BUILD A PLANT SUPPORT.mp4'

【问题讨论】:

  • 最后一个反斜杠是有意的吗? for i in /run/media/chad/New\ Volume/Chad/_Incoming/\*
  • 删除你的代码,直到问题仍然存在。
  • 您的两个 cmets 都非常有帮助。谢谢。

标签: bash


【解决方案1】:

当您对* 进行反斜杠转义时,它不再是通配符。所以

for i in /run/media/chad/New\ Volume/Chad/_Incoming/\*; do

没有按照您的预期进行,并且从调试输出中可以看出它的作用(即,它将$i 设置为不存在的目录/run/media/chad/New\ Volume/Chad/_Incoming/*

当你修复它时,你会发现

mv -v /run/media/chad/New\ Volume/Chad/_Incoming/* /run/media/chad/New\ Volume/Chad/@

并没有真正做你想做的事,因为/run/media/chad/New\ Volume/Chad/_Incoming/ 中所有新创建的目录都将匹配全局并移动到@

【讨论】:

  • 就是这样。谢谢! -- 我对 bash 脚本还很陌生,所有的引号、反斜杠等都需要小心处理!
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多