在第一个正斜杠之前将字符串放在字符串中,逐行读取

时间:2017-07-09 21:49:37

标签: linux bash shell file

我正在编写一个bash脚本,删除delete.txt中给出路径的所有文件。 delete.txt长达数千行,每行的路径结构如下:

Abies concolor/images/FV-GFVM-725_crop.jpg

第一个目录名称中有空格。

目前,我的bash脚本会读取delete.txt的每一行,将其保存到$line并删除它。

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
    "rm $line"
done < "$1"

但是,因为第一个目录名中有空格,所以我的rm命令返回:

rm Abies concolor/images/FV-GFVM-725_crop.jpg: No such file or directory

在执行rm命令之前,我可以在bash脚本中在每行的第一个单词之前和之后添加引号?

1 个答案:

答案 0 :(得分:1)

问题在于line调用。只需正确引用#!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do rm "$line" done < "$1" 变量:

cat delete.txt | xargs -I{} rm '{}'

或者,甚至更简单,您可以使用xargs和oneliner替换完整的脚本:

rm

这将为delete.txt中的每一行-I <placeholder>运行,并正确引用。这里的诀窍是使用rm '<placeholder>'选项,这将确保命令<placeholder>每行执行一次(不是单词),每次用<ContentPage.BindingContext> <viewModels:InqueritoViewModel/> </ContentPage.BindingContext> <StackLayout> <Button Command="{Binding GetinqueritoCommand}" Text="Open Inquery"></Button> <ListView x:Name="InqueritoView" ItemsSource="{Binding Inqueritos}" HasUnevenRows="True" ItemSelected="ListView_OnItemSelected"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout> <StackLayout> <Label x:Name="Label1" Text="{Binding Pergunta}"></Label> </StackLayout> <StackLayout Orientation="Horizontal"> <controls:Checkbox></controls:Checkbox> <Label Text="{Binding Resposta}" VerticalTextAlignment="Center"></Label> </StackLayout> <StackLayout Orientation="Horizontal"> <controls:Checkbox></controls:Checkbox> <Label Text="{Binding Resposta1}" VerticalTextAlignment="Center"></Label> </StackLayout> <StackLayout Orientation="Horizontal" > <controls:Checkbox></controls:Checkbox> <Label Text="{Binding Resposta2}" VerticalTextAlignment="Center"></Label> </StackLayout> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> 替换当前行的文件名。