【问题标题】:finding files | mv to one dir level up查找文件 | mv 到一级目录
【发布时间】:2013-11-13 15:55:30
【问题描述】:

我正在查找 mp3 和 mp3.md5 文件并将它们移动到上一级目录。如何指示 mv 目标路径?

找到:http://www.cyberciti.biz/tips/howto-linux-unix-find-move-all-mp3-file.html 哪一种帮助——文件结构如下。从 $LOCATION 运行脚本。

|-- 681506b
|   |-- 681506b.xml
|   `-- Web_Copy
|       |-- 681506b_01.mp3
|       `-- 681506b_01.mp3.md5
DESIRED STRUCTURE AFTER DELETING 'Web_Copy' dir:
|-- 681506b
|   |--681506b.xml
|   |--681506b_01.mp3
|   |--681506b_01.mp3.md5

LOCATION="/var/www/web/html/testdata/"
DIRLIST=`ls -x`
for DIR in $DIRLIST
do
  if [ -d "$DIR" ]
   then
   find . -name "*.mp3*" -type f -print0|xargs -0L1 mv {} $LOCATION$DIR
  fi
done

ERROR: mv: target ./681506b/Web_Copy/681506b_01.mp3 is not a directory
S/B:  mv /var/www/web/html/testdata/681506b/
REPLACED mv with echo: 
{} /var/www/web/html/testdata/680593a./681506b/Web_Copy/681506b_01.mp3

谢谢

【问题讨论】:

  • 脚本运行后能否贴出想要的目录结构?
  • 你能用echo替换mv并打印结果吗?

标签: bash shell xargs mv


【解决方案1】:

可能是这样的(未测试)

for i in $( find $LOCATION -type d -name 'Web_Copy' ); do 
  mv $i/* $i/.. && rmdir $i
done 

【讨论】:

  • 好的,我做了最简单的例子。而且,是的,我没有处理空格,需要额外的努力来处理其他情况......但是,OP发送的示例应该可以正常工作。您介意发送您的答案,以便我们从中学习吗?
  • 这绝对有效,而且还负责删除目录的其他任务——正如您在帖子中所写的那样。谢谢!
【解决方案2】:

尝试将您的 find 命令更改为

find . -name '*.mp3*' -type f -print0 | xargs -0 -I list mv list ${LOCATION}${DIR}

【讨论】:

    【解决方案3】:

    这样不行吗?

    find . -name '*.mp3*' -type f -execdir mv -nv -- {} .. \;
    

    这将找到名称中带有 .mp3 的所有文件 (-type f)。对于每个这样的文件,它将从它们所在的目录运行命令mv {} ..(其中{} 被文件名替换)。那就是使用-execdir 而不是-exec

    看:

    gniourf@somewhere$ mkdir Test && cd Test
    gniourf@somewhere$ mkdir -p 681506b{,/Web_Copy}; touch 681506b/{681506b.xml,Web_Copy/681506b.mp3{,.md5}}
    gniourf@somewhere$ tree
    .
    `-- 681506b
        |-- 681506b.xml
        `-- Web_Copy
            |-- 681506b.mp3
            `-- 681506b.mp3.md5
    
    2 directories, 3 files
    gniourf@somewhere$ find . -name '*.mp3*' -type f -execdir mv -nv -- {} .. \;
    `./681506b.mp3' -> `../681506b.mp3'
    `./681506b.mp3.md5' -> `../681506b.mp3.md5'
    gniourf@somewhere$ tree
    .
    `-- 681506b
        |-- 681506b.mp3
        |-- 681506b.mp3.md5
        |-- 681506b.xml
        `-- Web_Copy
    
    2 directories, 3 files
    gniourf@somewhere$ 
    

    【讨论】:

    • 确实有效: find . -name '.wav' -type f -execdir mv -v -- {} .. \;虽然我没有 n 选项
    • @edroms -n 选项只是 no clobber 选项:它是不覆盖现有文件的安全开关,非常适合在测试环境中使用。如果您知道自己在做什么,则高度可选!
    • 顺便说一句,感谢您提供精美插图的解决方案。 -n 选项在我的 bash shell 中甚至都不可用。这是 Redhat 5。
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多